小能豆

Python 请求-打印整个 http 请求(原始)?

python

在使用该requests模块时,有没有办法打印原始 HTTP 请求?

我不想只获取标头,我想要请求行、标头和内容打印输出。能否查看 HTTP 请求最终构建的内容?


阅读 18

收藏
2024-09-20

共1个答案

小能豆

是的,在使用 requests 模块时,你可以打印出原始的 HTTP 请求,包括请求行、标头和内容。虽然 requests 模块本身没有直接提供打印完整原始请求的功能,但可以通过以下方法实现。

方法 1:使用 requests-toolbelt 工具

requests-toolbelt 库提供了一个 dump 工具,可以方便地打印出完整的请求和响应内容,包括请求行、标头和内容。

安装 requests-toolbelt:

首先,你需要安装该库:

pip install requests-toolbelt

然后,你可以使用如下代码打印完整的请求信息:

import requests
from requests_toolbelt.utils import dump

# 示例请求
url = "https://httpbin.org/post"
data = {"key": "value"}

response = requests.post(url, data=data)

# 打印原始请求和响应
request_data = dump.dump_all(response)

# 输出 HTTP 请求和响应
print(request_data.decode('utf-8'))

这段代码会打印出完整的 HTTP 请求和响应,包括请求行、标头和内容。

方法 2:使用 PreparedRequest 打印原始请求

另一种方法是使用 PreparedRequest 对象。通过创建一个请求并使用 requests.Session().prepare_request() 方法准备请求,然后打印出请求的相关字段。

import requests

# 创建一个会话
session = requests.Session()

# 创建一个 Request 对象
req = requests.Request('POST', 'https://httpbin.org/post', data={'key': 'value'})

# 准备请求 (构建最终的原始请求)
prepared = session.prepare_request(req)

# 打印原始请求
print(f'{prepared.method} {prepared.url} HTTP/1.1')
for header, value in prepared.headers.items():
    print(f'{header}: {value}')
print(f'\n{prepared.body}')

在这段代码中:
- Request 对象用于创建请求。
- 通过 session.prepare_request(req) 构建原始请求。
- 最后,打印出 method, url, headersbody 来构建完整的 HTTP 请求。

方法 3:使用调试模式

requests 库中可以通过开启调试模式,利用 logging 模块来查看请求的详细内容:

import requests
import logging

# 开启调试日志
logging.basicConfig(level=logging.DEBUG)

# 发送请求
response = requests.post('https://httpbin.org/post', data={'key': 'value'})

通过这种方法,requests 模块的调试日志会输出请求的详细信息,包括请求行、标头和内容。

总结:

  • 方法 1: 使用 requests-toolbelt 库,通过 dump 工具获取原始请求。
  • 方法 2: 使用 PreparedRequest 对象,手动打印构建的 HTTP 请求。
  • 方法 3: 使用 logging 模块开启调试日志,输出请求的详细内容。

这几种方法都可以帮助你查看 requests 模块最终构建的 HTTP 请求的完整内容。

2024-09-20