2014-03-04 49 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