CodeGym /课程 /Python SELF ZH /使用 HttpClient

使用 HttpClient

Python SELF ZH
第 23 级 , 课程 4
可用

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。你需要知道怎么操作它, 这样你就能正确配置它们的工作。

1
调查/小测验
序列化第 23 级,课程 4
不可用
序列化
序列化
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION