Potrebujem odoslať JSON z klienta na server. Používam Python 2.7.1 a simplejson. Klient používa Requests. Server je CherryPy. Zo servera môžem GETovať JSON (kód nie je zobrazený), ale keď sa pokúsim POSTovať JSON na server, dostanem "400 Bad Request".
Tu je môj klientsky kód:
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)
Tu je kód servera.
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())
Nejaké nápady?
Od verzie Requests 2.4.2 môžete vo volaní alternatívne použiť parameter 'json', ktorý to zjednodušuje.
>>> 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: Táto funkcia bola pridaná do oficiálnej dokumentácie. Môžete si ju pozrieť tu: Dokumentácia k požiadavkám
Ukázalo sa, že mi chýbali informácie v záhlaví. Funguje to takto:
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)
Od požiadaviek 2.4.2 (https://pypi.python.org/pypi/requests) je podporovaný parameter "json". Nie je potrebné uvádzať "Content-Type". Takže kratšia verzia:
requests.post('http://httpbin.org/post', json={'test': 'cheers'})