Python 3.4 请求主体格式错误
在Python 3.4中,我正在使用Requests库和一个for循环来组合多个项目的API请求,以获取JSON内容。即使body变量被识别为字符串类型(str),我还是遇到了HTTP 400错误。但是,如果我打印这个内容并把它复制到一个新变量中,就能成功。这是怎么回事呢?
import requests,json
list_length = len(namelist) #namelist arranged earlier in code
payload='['
for x in range(0, list_length):
payload += '{"name": "'+ namelist[x] + '"}'
if x<list_length-1:
payload += ', '
payload += ']'
url = 'http://api.turfgame.com/v4/users'
headers = {'Content-Type': 'application/json'}
req = requests.post(url, data=json.dumps(payload),headers=headers)
>>> payload
'[{"name": "sune"}, {"name": "Demon"}, {"name": "kingenin"}]'
1 个回答
2
你正在创建一个JSON字符串,然后又把它编码成JSON字符串。这种双重编码在这里并不是你想要的:
>>> payload = '[{"name": "sune"}, {"name": "Demon"}, {"name": "kingenin"}]'
>>> print(json.dumps(payload))
"[{\"name\": \"sune\"}, {\"name\": \"Demon\"}, {\"name\": \"kingenin\"}]"
这是一个JSON 字符串,里面包含了一个带引号的JSON列表。
先构建一个列表,然后把它传给json.dumps()
:
payload = [{'name': name} for name in namelist]
url = 'http://api.turfgame.com/v4/users'
headers = {'Content-Type': 'application/json'}
req = requests.post(url, data=json.dumps(payload),headers=headers)
这样就能发送一个正确的JSON列表了:
>>> payload
[{'name': 'sune'}, {'name': 'Demon'}, {'name': 'kingenin'}]
>>> print(json.dumps(payload))
[{"name": "sune"}, {"name": "Demon"}, {"name": "kingenin"}]
你也可以在构建payload
的时候直接发送它,而不需要传给json.dumps()
,不过为什么要自己费劲呢?
如果你使用的是requests
版本2.4.2或更高版本,它可以帮你处理JSON编码;只需把Python对象传给json
这个关键字参数,它还会自动设置正确的内容类型头:
payload = [{'name': name} for name in namelist]
url = 'http://api.turfgame.com/v4/users'
req = requests.post(url, json=payload)