Python POST 使用嵌套字典请求 values/args

Python POST request with Nested Dictionary values/args

已查看 here, here and here,但仍有问题。 我有一个看起来像这样的 POST data

{
   "config":{
             "param1": "param1 value",
             "param2": "param2 value",
             "param3": "param3 value"
            },
   "name": "Testing API",
   "url": "https://testingapi.my.own.com",
   "enabled": true
}

我有以下 headers:

{
  "Content-Type": "application/json",
  "referer": "https://testingapi.my.own.com",
  "X-CSRFToken": "my token value here"
}

如何为 session.post 设置格式?

我不断收到 400 的响应代码,并且日志表明我没有在 post 请求中发送所需的参数。

代码如下:

headers = {"Content-Type": "application/json",
           "referer": "https://testingapi.my.own.com",
           "X-CSRFToken": "my token"
}

request_data = {
   "config":{
             "param1": "param1 value",
             "param2": "param2 value",
             "param3": "param3 value"
            },
   "name": "Testing API",
   "url": "https://testingapi.my.own.com",
   "enabled": "true"
}

#tried the following:
r = session.post(url, data =  request_data, headers=headers)
r = session.post(url, json =  json.dumps(request_data), headers=headers)

当您执行 data = request_data 时,您的嵌套字典未按预期打包到请求正文中。尝试检查 request 对象的 body 属性:

import requests
s = requests.Session()
request_data = {
    "config":{
        "param1": "param1 value",
        "param2": "param2 value",
        "param3": "param3 value"
     },
    "name": "Testing API",
    "url": "https://testingapi.my.own.com",
    "enabled": True
}
r = s.post('https://httpbin.org/post/404', data=request_data )
r.request.body

returns

'url=https%3A%2F%2Ftestingapi.my.own.com&enabled=True&config=param3&config=param2&config=param1&name=Testing+API'

当你json = json.dumps(request_data)你json-转储你的数据两次,所以服务器(在反序列化数据一次之后)只看到一个json 字符串而不是未序列化的字典(参见 requests docs)。

因此您需要在将数据传递给 data

之前序列化您的数据
r = s.post('https://httpbin.org/post/404', data=json.dumps(request_data), )

或者按照 Paul 的建议,使用 json 参数并将您的数据字典传递给它:

r = s.post('https://httpbin.org/post/404', json=request_data)