Jeg trenger å POST en JSON fra en klient til en server. Jeg bruker Python 2.7.1 og simplejson. Klienten bruker forespørsler. Serveren er CherryPy. Jeg kan få en hardkodet JSON fra serveren (koden vises ikke), men når jeg prøver å POST en JSON til serveren, får jeg "400 Bad Request".
Her er klientkoden min:
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)
Her er serverkoden.
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())
Noen ideer?
Fra og med Requests versjon 2.4.2 kan du alternativt bruke parameteren 'json' i anropet, noe som gjør det enklere.
>>> 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'}
EDIT: Denne funksjonen er lagt til i den offisielle dokumentasjonen. Du kan se den her: Ber om dokumentasjon
Det viser seg at jeg manglet topptekstinformasjonen. Følgende fungerer:
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)
Fra forespørsler 2.4.2 (https://pypi.python.org/pypi/requests) støttes parameteren "json". Det er ikke nødvendig å spesifisere "Content-Type". Så den kortere versjonen:
requests.post('http://httpbin.org/post', json={'test': 'cheers'})