通过 Python 请求请求 Datadog 日志时出现错误 500

Error 500 when requesting Datadog logs by Python Requests

我有以下 curl 命令可以正常工作:

curl -X POST -H 'content-type: application/json' -H "DD-API-KEY: ${api_key}" -H "DD-APPLICATION-KEY: ${app_key}" \
-d '{ 
        "query": "service:my_service",
        "time": {
            "from": "2019-11-28T00:00:00Z",
            "to": "2019-11-28T16:00:00Z"
        },
        "sort": "asc",
        "limit": 1000
    }' "https://api.datadoghq.com/api/v1/logs-queries/list" -o output3.json5

然后我将此请求转换为 Python 请求,curl 方法有效,但 Python returns 500 错误,没有任何详细信息。

import requests

def main():
    headers = {
        'content-type': 'application/json',
        'DD-API-KEY': 'AAA',
        'DD-APPLICATION-KEY': 'XXX',
    }

    data = {
        "query": "service:my_service",
        "time": {
            "from": "now - 1h",
            "to": "now"
        },
        "sort": "asc",
        "limit": 50
    }
    response=requests.post("https://api.datadoghq.com/api/v1/logs-queries/list",headers=headers, data=data)

我在 Docker 之外尝试过,猜测可能连接是关键,但它也不起作用。

将两者都指向 httpbin 这样的服务,看看它们有何不同。

Requests 的 data 选项默认情况下 POST 请求 generates form-encoded data,而 curl 直接传递 JSON 字符串。您可以手动将有效负载编码为 JSON 字符串:

import json

response = requests.post(..., data=json.dumps(data))
#                                  ^^^^^^^^^^

或者如果您有 Requests 版本 2.4.2 或更高版本,您可以使用 json 参数将您的 dict 自动转换为 JSON:

response = requests.post(..., json=data)
#                             ^^^^