2014-03-04 2 views
0

Python 3.4에서 Request와 for 루프를 사용하여 본문과 JSON 컨텐트를 가져 오는 다중 항목 API 요청을 결합했습니다. 본문 변수가 type()이있는 str 클래스로 인식되는 경우에도 HTTP 400 오류가 발생합니다. 그러나 인쇄하고 새 변수에 내용을 복사하면 성공합니다. 어떤 종류의 포맷팅이 진행되고 있습니까?Python 3.4 Requests Body wrong format

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

요청은 파이썬 3.3을 지원, **하지 ** 3.4. 아직은 아니야. –

답변

1

JSON 문자열을 만든 다음 JSON 문자열로 인코딩합니다.

인용 된 JSON의 목록이 포함 된 JSON 문자열,의
>>> payload = '[{"name": "sune"}, {"name": "Demon"}, {"name": "kingenin"}]' 
>>> print(json.dumps(payload)) 
"[{\"name\": \"sune\"}, {\"name\": \"Demon\"}, {\"name\": \"kingenin\"}]" 

..

목록을 구축하고, 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()으로 전달하지 않고도 payload을 보낼 수 있지만 왜 개와 짖는 소리가 들리지 않습니까?

requests 버전 2.4.2 이상을 사용하려는 경우 JSON 인코딩을 처리하도록 설정할 수 있습니다. json 키워드 인수에 파이썬 객체를 전달하고도 올바른 컨텐츠 유형 헤더를 설정합니다 :

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