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

新手上路,请多包涵

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

我不只想要标题,我想要请求行、标题和内容打印输出。是否可以看到最终由 HTTP 请求构造的内容?

原文由 huggie 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 3k
2 个回答

由于 v1.2.3 Requests 添加了 PreparedRequest 对象。根据文档“它包含将发送到服务器的确切字节”。

可以使用它来漂亮地打印请求,如下所示:

 import requests

req = requests.Request('POST','http://stackoverflow.com',headers={'X-Custom':'Test'},data='a=1&b=2')
prepared = req.prepare()

def pretty_print_POST(req):
    """
    At this point it is completely built and ready
    to be fired; it is "prepared".

    However pay attention at the formatting used in
    this function because it is programmed to be pretty
    printed and may differ from the actual request.
    """
    print('{}\n{}\r\n{}\r\n\r\n{}'.format(
        '-----------START-----------',
        req.method + ' ' + req.url,
        '\r\n'.join('{}: {}'.format(k, v) for k, v in req.headers.items()),
        req.body,
    ))

pretty_print_POST(prepared)

产生:

 -----------START-----------
POST http://stackoverflow.com/
Content-Length: 7
X-Custom: Test

a=1&b=2

然后你可以用这个发送实际的请求:

 s = requests.Session()
s.send(prepared)

这些链接指向可用的最新文档,因此它们的内容可能会发生变化: 高级 - 准备好的请求API - 较低级别的类

原文由 AntonioHerraizS 发布,翻译遵循 CC BY-SA 4.0 许可协议

import requests

response = requests.post('http://httpbin.org/post', data={'key1': 'value1'})
print(response.request.url)
print(response.request.body)
print(response.request.headers)

Response 对象有一个 .request 属性,它是发送的 PreparedRequest 对象。

原文由 Payman 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题