2014-03-04 54 views
0

在Python 3.4中,我使用请求和for循环来合并多项API请求获取JSON内容的正文。即使身体变量被识别为类型为()的str类,它也会产生HTTP 400错误。但是,如果我打印并将内容复制到一个新的变量,它是成功的。什么样的格式正在发生?Python 3.4请求正文错误格式

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

请求只对Python 3.3支持多达**,**不是3.4。至少还没有。 –

回答

1

您正在创建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"}] 

你也可以发送​​你建立它,而不是传递给json.dumps(),但为什么有一只狗和你自己呢?

如果您要使用requests版本2.4.2或更高版本,您可以让它为您处理JSON编码;通过在的Python对象为json关键字参数,它甚至会设置正确的Content-Type头:

payload = [{'name': name} for name in namelist] 
url = 'http://api.turfgame.com/v4/users' 
req = requests.post(url, json=payload) 
+0

谢谢,我的工作可以继续:) – DIProgan

+0

正如Martijn指出的,我们还不支持3.4版本,因为它是预发行版本。有了这个说法,我们并不指望有任何问题:如果有,请告诉我们。 – Lukasa