具有嵌套字典值/参数的Python POST请求

2024-10-03 21:35:42 发布

您现在位置:Python中文网/ 问答频道 /正文

已经看过hereherehere但仍有问题。 我有一个POST data看起来像这样:

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

我有以下标题:

{
  "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)

Tags: httpscomjsonurldataherevaluemy
1条回答
网友
1楼 · 发布于 2024-10-03 21:35:42

当您执行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

返回

'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字符串,而不会看到未序列化的dict(请参见requests docs

因此,您需要在将数据传递给data之前序列化数据

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

或者正如Paul所建议的,使用json参数并将数据dict传递给它:

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

相关问题 更多 >