5.1 认识 HttpClient
在 Python 中,像许多编程语言一样,有一个标准的 HttpClient。在 Python 中,它叫 http.client,可以执行底层的 HTTP 请求并处理 HTTP 响应。它 可以创建到 HTTP 服务器的连接并与其进行交互。
像 http.client 这样的低层模块提供了对 HTTP 操作的更详细控制, 但需要更多的代码来完成任务。与之相对,高层模块如 requests, 提供了更简单的接口,隐藏了许多实现细节。
http.client 的主要功能
模块 http.client 提供了以下主要功能:
- 创建 HTTP 连接。
- 发送 HTTP 请求。
- 读取 HTTP 响应。
- 处理请求和响应的头部和主体。
与 requests 模块不同,http.client 模块更加 底层,注重 HTTP 请求工作的细节。
http.client 的主要类和方法
| 类/方法 | 描述 |
|---|---|
HTTPConnection |
创建 HTTP 连接。 |
HTTPSConnection |
创建 HTTPS 连接。 |
request(method, url, ...) |
发送 HTTP 请求。 |
getresponse() |
获取请求的响应。 |
response.status |
响应的状态代码。 |
response.reason |
响应状态的文本描述。 |
response.read() |
读取响应数据。 |
response.getheaders() |
获取所有响应头。 |
response.getheader(name) |
获取特定头部的值。 |
下面我们将更详细地了解其中的一些。
5.2 执行 GET 请求
要使用 http.client 库执行请求, 需要按照以下步骤操作:
建立连接
发送请求
获取响应
关闭连接
重要的是,使用后关闭连接对于释放资源和防止内存泄漏是必要的。这在处理大量请求或长寿命的应用程序中尤其重要。
使用 HTTPConnection 进行普通 HTTP 请求的示例:
import http.client
# 创建 HTTP 连接
conn = http.client.HTTPConnection("example.com")
# 发送 GET 请求
conn.request("GET", "/")
# 获取响应
response = conn.getresponse()
print(response.status, response.reason)
# 关闭连接
conn.close()
使用 HTTPSConnection 的示例:
import http.client
# 创建连接
conn = http.client.HTTPSConnection("jsonplaceholder.typicode.com")
# 发送 GET 请求
conn.request("GET", "/posts/1")
# 获取响应
response = conn.getresponse()
print(response.status, response.reason)
# 读取和解码响应数据
data = response.read().decode('utf-8')
print(data)
# 获取所有响应头
headers = response.getheaders()
for header in headers:
print(f"{header[0]}: {header[1]}")
# 关闭连接
conn.close()
是不是比用 requests 要长一点?
5.3 执行 POST 请求
使用 http.client 执行 POST 请求 和 GET 请求 非常相似,只是需要将数据打包成 json 字符串 ,还需要手动指定数据类型——添加 Content-Type 头。
示例:
import http.client
import json
# 发送 POST 请求
conn.request("POST", "/posts", body=payload, headers=headers)
作为 body,需要传递一个 json 对象,并将其序列化为字符串, 作为 headers,是一个包含数据类型信息的字典。
它们可以像这样:
# 发送的数据
payload = json.dumps({
"title": "foo",
"body": "bar",
"userId": 1
})
# 头 – 内容类型
headers = {
'Content-Type': 'application/json'
}
完整的 POST 请求 代码如下:
import http.client
import json
# 发送的数据
payload = json.dumps({
"title": "foo",
"body": "bar",
"userId": 1
})
# 头
headers = {
'Content-Type': 'application/json'
}
# 创建连接
conn = http.client.HTTPSConnection("jsonplaceholder.typicode.com")
# 发送 POST 请求
conn.request("POST", "/posts", body=payload, headers=headers)
# 获取响应
response = conn.getresponse()
print(response.status, response.reason)
# 读取和解码响应数据
data = response.read().decode('utf-8')
print(data)
# 关闭连接
conn.close()
5.4 处理请求执行中的错误
我也觉得,提供一个错误处理的例子会很有用,因为它和 requests 的行为有所不同。在 http.client 模块中,当出现连接问题或其他 HTTP 错误时,异常会 自动 抛出。
示例:
import http.client
try:
# 创建连接
conn = http.client.HTTPSConnection("jsonplaceholder.typicode.com")
# 发送 GET 请求
conn.request("GET", "/posts/1")
# 获取响应
response = conn.getresponse()
print(response.status, response.reason)
# 读取和解码响应数据
data = response.read().decode('utf-8')
print(data)
except http.client.HTTPException as e:
print("发生 HTTP 错误:", e)
except Exception as e:
print("发生错误:", e)
finally:
# 关闭连接
conn.close()
怎么说呢?用 requests 模块肯定更简单。 但是!很多模块和框架底层用的正是 低层级的 http.client。你需要知道怎么操作它, 这样你就能正确配置它们的工作。
GO TO FULL VERSION