为什么在使用 python 和请求库进行 api 调用时会出现超时错误,如果 curl 运行良好?

Why do I get timeout error doing an api call using python with requests library if with curl works well?

我正在尝试对 api 进行简单调用。通过终端中的 curl 指令工作正常,我得到了 json 文件

curl -X GET "https://my.domain.com/api/product/?name=product" \
    -H "Accept: application/json" \
    -H "Content-Type: application/json" \
    -H "x-api-key: 02987eafdeef73450982734"

我试图在 python 中使用请求库进行相同的调用,但我总是收到超时错误:

base_url = 'https://my.domain.com'
timeout = 10
headers = {
    'content-type': 'application/json',
    'Accept': 'application/json',
    'Content-Type': 'application/json',
    'x-api-key': '02987eafdeef73450982734'
}

results = requests.get(
    f'{base_url}/api/product/?name=product',
    headers=headers,
    timeout=timeout
) # a headers param exists

你能看出原因吗?我做错了什么吗?我错过了什么吗?

看来 curl 的默认超时是 5 分钟 (AskUbuntu)。 我的第一个建议是将使用 requests 包的请求的超时时间增加到 5 分钟 (timeout = 5 * 60) 并查看请求是否成功。

为了直接回答您的问题,这些请求看起来非常相似。 您可能还想尝试使用 GUI 客户端发出请求(例如 Hoppscotch);它会告诉你响应时间 e.t.c.

如果您只看到来自 requests 的 timeout-style 错误,请尝试不同的 Python 库来发出 HTTP 请求:它可能会帮助您缩小问题范围。

我没有在 python 中很好地设置 api url。我使用的与我在问题中发布的不一样。

启用详细模式帮助我在请求库中找到错误。这样:

import logging
import http.client as http_client
http_client.HTTPConnection.debuglevel = 1
logging.basicConfig()
logging.getLogger().setLevel(logging.DEBUG)
requests_log = logging.getLogger("requests.packages.urllib3")
requests_log.setLevel(logging.DEBUG)
requests_log.propagate = True

# request GET call

要在 curl 中启用详细模式,我只需要添加 -v 参数。