Bir istemciden sunucuya bir JSON POST etmem gerekiyor. Python 2.7.1 ve simplejson kullanıyorum. İstemci Requests kullanıyor. Sunucu CherryPy kullanıyor. Sunucudan sabit kodlanmış bir JSON alabiliyorum (kod gösterilmiyor), ancak sunucuya bir JSON POST etmeye çalıştığımda "400 Bad Request" alıyorum.
İşte istemci kodum:
data = {'sender': 'Alice',
'receiver': 'Bob',
'message': 'We did it!'}
data_json = simplejson.dumps(data)
payload = {'json_payload': data_json}
r = requests.post("http://localhost:8080", data=payload)
İşte sunucu kodu.
class Root(object):
def __init__(self, content):
self.content = content
print self.content # this works
exposed = True
def GET(self):
cherrypy.response.headers['Content-Type'] = 'application/json'
return simplejson.dumps(self.content)
def POST(self):
self.content = simplejson.loads(cherrypy.request.body.read())
Bir fikrin var mı?
Requests 2.4.2 ve sonraki sürümlerinden itibaren, alternatif olarak çağrıda 'json' parametresini kullanabilirsiniz, bu da daha basit hale getirir.
>>> import requests
>>> r = requests.post('http://httpbin.org/post', json={"key": "value"})
>>> r.status_code
200
>>> r.json()
{'args': {},
'data': '{"key": "value"}',
'files': {},
'form': {},
'headers': {'Accept': '*/*',
'Accept-Encoding': 'gzip, deflate',
'Connection': 'close',
'Content-Length': '16',
'Content-Type': 'application/json',
'Host': 'httpbin.org',
'User-Agent': 'python-requests/2.4.3 CPython/3.4.0',
'X-Request-Id': 'xx-xx-xx'},
'json': {'key': 'value'},
'origin': 'x.x.x.x',
'url': 'http://httpbin.org/post'}
DÜZENLEME: Bu özellik resmi belgelere eklenmiştir. Buradan görüntüleyebilirsiniz: İstek belgeleri
Görünüşe göre başlık bilgilerini kaçırıyormuşum. Aşağıdaki çalışıyor:
url = "http://localhost:8080"
data = {'sender': 'Alice', 'receiver': 'Bob', 'message': 'We did it!'}
headers = {'Content-type': 'application/json', 'Accept': 'text/plain'}
r = requests.post(url, data=json.dumps(data), headers=headers)
2.4.2 (https://pypi.python.org/pypi/requests) isteklerinden itibaren "json" parametresi desteklenmektedir. Content-Type" belirtmeye gerek yoktur. Yani daha kısa versiyonu:
requests.post('http://httpbin.org/post', json={'test': 'cheers'})