Python 基础教程

Python 高级教程

Python 相关应用

Python 笔记

Python FAQ

original icon
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.knowledgedict.com/tutorial/python-http.html

Python 多种 http 请求处理详解


Python 中自带了 http 模块,它可以满足基本的 http 请求处理;除此之外,还有最为人所熟知的 requests,它虽然是一个第三方模块,但是按照目前的情形来看,已经成为了事实上的 Python HTTP 请求标准库。

内置的 http 模块

自带的 http 包中含有几个用来开发 HTTP 协议的模块。

  • http.client 是一个底层的 HTTP 协议客户端,被更高层的 urllib.request 模块所使用。
  • http.server 是基于 socket server 的基本 HTTP 服务器。
  • http.cookies 是 cookie 相关的内容及相关策略。
  • http.cookiejar 是针对 cookie 模块的管理封装。

http.client 模块

http.client 模块主要是客户端的 HTTP 通信实现库,主要是发送和接收 HTTP 报文。

其中主要是以下类:

  • HTTPConnection:基于 HTTP 协议的客户端,指定 URL 后,可以发送请求报文和接收响应报文。
  • HTTPResponse:封装来自服务器的 HTTP 响应,它提供对请求头和实体主体等的访问。

http.client HTTPConnection 类

构造函数:

def __init__(self, host, port=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, source_address=None):

参数:

  • host:请求的服务器host,不能以 http:// 等协议开头;
  • port:请求服务器的端口,数字类型;
  • timeout:单次请求的 socket timeout,未设置时,默认使用模块内的全局超时时间,Python2.6 版本新加的;
  • source_address:可选参数,是一个(主机,端口)的元组作为HTTP连接的源地址,Python3.2 版本新加的;

request 方法:

使用 HTTP 请求方法和向服务器发送请求。

def request(self, method, url, body=None, headers={}, *, encode_chunked=False):

参数:

  • method:HTTP 请求的方式,如 'GET'、'POST' 等字符串形式,必须要大写形式
  • url:请求的 url 路径;
  • body:请求的 body 数据;
  • headers:请求追加的头信息,字典类型;
  • encode_chunked:仅当在 headers 中指定传输编码时,encode_chunked 参数才相关。如果 encode_chunked 是 False,则 HTTPConnection 对象假定所有编码由调用代码处理。如果它是 True,主体将被块编码;

getresponse 方法:

在发送请求后,调用此方法从服务器获取相应响应信息。

def getresponse(self):

返回值:

返回 HTTPResponse 对象实例。

http.client HTTPResponse 类

字段:

status:服务器返回的状态码;

reason:服务器返回的原因短语;

read 方法:

读取并返回响应正文,或直到下一个 amt 字节。

def read(self, amt=None):

参数:

  • amt:可选参数,表示读取指定长度的字符,默认为 None,即读取所有内容;

示例

import http.client

http_conn = http.client.HTTPConnection('www.kfa.or.kr')
http_conn.set_debuglevel(1)
http_conn.request('GET', '/national/gamelist2.asp', headers={'User-Agent': 'python3.6/http'})
response = http_conn.getresponse()
print('\n')
print('-------------')
print(response.status)
print(response.read().decode('utf-8'))

requests 三方模块

GET 请求

使用 requests 发出 GET 请求是一件很简单的事情,只需要两步:

  1. 引入 requests
  2. 调用 requests.get() 方法。

例如:

import requests

r = requests.get('http://www.baidu.com')
print(r)

获取请求的响应状态码:

<Response [200]>

处理响应

在发出 HTTP 请求之后,我们需要对服务器返回的响应进行处理。

requests 提供了3种响应形式供我们选择和使用:

  1. .content原始的响应主体字节;
  2. .text:经过编码后的响应主体字符串;
  3. .json():经过 JSON 处理的响应主体。

此外,http 的状态码通过 status_code 字段获取,状态码有如下5个大类:

  1. 1xx:表示信息;
  2. 2xx:表示请求被接收;
  3. 3xx:表示请求被重定向了;
  4. 4xx:表示客户端错误;
  5. 5xx:表示服务器错误。