Man ir nepieciešams no klienta uz serveri nosūtīt JSON. Es izmantoju Python 2.7.1 un simplejson. Klients izmanto Requests. Serveris ir CherryPy. Es varu GET no servera (kods nav parādīts), bet, kad mēģinu POSTēt JSON uz serveri, saņemu "400 Bad Request".
Šeit ir mans klienta kods:
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)
Šeit ir servera kods.
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())
Kādas idejas?
Sākot ar Requests versiju 2.4.2 un jaunāku, izsaukumā var izmantot arī parametru 'json', kas to padara vienkāršāku.
>>> 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: Šī funkcija ir pievienota oficiālajai dokumentācijai. To var apskatīt šeit: Pieprasījumu dokumentācija
Izrādās, man trūka galvenes informācijas. Darbojas šādi:
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)
No pieprasījumiem 2.4.2 (https://pypi.python.org/pypi/requests) tiek atbalstīts "json" parametrs. Nav nepieciešams norādīt "Content-Type". Tātad īsākā versija:
requests.post('http://httpbin.org/post', json={'test': 'cheers'})