在我的情况下,我使用请求库调用贝宝的API通过HTTPS。不幸的是,我从贝宝得到一个错误,贝宝支持无法找出错误是什么或什么原因造成的。他们想让我“请提供整个请求,包括标题”。

我该怎么做呢?


当前回答

详细配置选项可能允许您看到您想要的结果。文档中有一个例子。

注意:阅读下面的评论:详细配置选项似乎不再可用。

其他回答

详细配置选项可能允许您看到您想要的结果。文档中有一个例子。

注意:阅读下面的评论:详细配置选项似乎不再可用。

如果你使用的是python2。X,尝试安装urllib2打开器。这应该打印出您的标题,尽管您可能必须将其与您正在使用的其他打开器结合起来以击中HTTPS。

import urllib2
urllib2.install_opener(urllib2.build_opener(urllib2.HTTPHandler(debuglevel=1)))
urllib2.urlopen(url)

调试HTTP本地请求的一个更简单的方法是使用netcat。如果你跑了

nc -l 1234

您将开始在端口1234上监听HTTP连接。您可以通过http://localhost:1234/foo/foo/....访问它

在终端上,您将看到发送到端点的原始数据。例如:

POST /foo/foo HTTP/1.1
Accept: application/json
Connection: keep-alive
Host: example.com
Accept-Language: en-en
Authorization: Bearer ay...
Content-Length: 15
Content-Type: application/json

{"test": false}

正如其他人所注意到的,有一个很好的请求工具带模块,它具有使用请求钩子转储请求和响应内容的方便功能。不幸的是(到目前为止)只有一个钩子在成功完成请求时被调用。并不总是这样。例如,请求可能以ConnectionError或Timeout异常结束。

requests-toolbelt模块本身也提供了仅转储已完成请求的公共函数。然而,使用一些非公共api和Session子类,可以在发送请求之前实现日志记录,在接收响应之后实现日志记录。

注意:代码依赖于request -toolbelt模块的实现细节/非公共api,因此在未来会意外中断:

import requests

from requests_toolbelt.utils import dump

class MySession(requests.Session):
    def send(self, req, *args, **kwargs):
        prefixes = dump.PrefixSettings(b'< ', b'> ')

        data = bytearray()

        try:
            dump._dump_request_data(req, prefixes, data)
            resp = super().send(req, *args, **kwargs)
            dump._dump_response_data(resp, prefixes, data)
        finally:
            print(data.decode('utf-8'))

        return resp

下面是一个用法的例子:

>>> MySession().get('https://httpbin.org/headers')
< GET /headers HTTP/1.1
< Host: httpbin.org
< User-Agent: python-requests/2.25.1
< Accept-Encoding: gzip, deflate
< Accept: */*
< Connection: keep-alive
< 

> HTTP/1.1 200 OK
> Date: Fri, 19 Aug 2022 10:43:51 GMT
> Content-Type: application/json
> Content-Length: 225
> Connection: keep-alive
> Server: gunicorn/19.9.0
> Access-Control-Allow-Origin: *
> Access-Control-Allow-Credentials: true
> 
{
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Host": "httpbin.org", 
    "User-Agent": "python-requests/2.25.1"
  }
}
>>> MySession().get('https://non.existent')
< GET / HTTP/1.1
< Host: non.existent
< User-Agent: python-requests/2.25.1
< Accept-Encoding: gzip, deflate
< Accept: */*
< Connection: keep-alive
< 


Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/urllib3/connection.py", line 169, in _new_conn
    conn = connection.create_connection(
  File "/usr/lib/python3/dist-packages/urllib3/util/connection.py", line 73, in create_connection
    for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM):
  File "/usr/lib/python3.10/socket.py", line 955, in getaddrinfo
    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
socket.gaierror: [Errno -2] Name or service not known
...

之前的一个答案似乎被否决了,因为它以“没有什么是完全有效的”开头,然后提供了这个完美的解决方案:

使用pip Install requests-toolbelt安装实用程序的requests_toolbelt集合。 像这样使用它: 进口的要求 从requests_toolbelt。Utils导入转储 response = requests.get("https://v2.jokeapi.dev/joke/Any?safe-mode") 打印(dump.dump_all(响应).decode(“utf - 8”))