J'ai besoin de POST un JSON d'un client à un serveur. J'utilise Python 2.7.1 et simplejson. Le client utilise des demandes. Le serveur est CherryPy. Je peux obtenir un JSON codé en dur sur le serveur (code non affiché), mais lorsque j'essaie de POST un JSON sur le serveur, j'obtiens une "400 requête incorrecte".
Voici mon code client:
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)
Voici le code du serveur.
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())
Des idées?
À partir de la version 2.4.2 de Requests, vous pouvez également utiliser le paramètre "json" dans l'appel, ce qui simplifie les choses.
>>> 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: Cette fonctionnalité a été ajoutée à la documentation officielle. Vous pouvez le voir ici: Documentation de demandes
Il s'avère que je manquais les informations d'en-tête. Les oeuvres suivantes:
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)
A partir des demandes 2.4.2 ( https://pypi.python.org/pypi/requests ), le paramètre "json" est pris en charge. Pas besoin de spécifier "Content-Type". Donc, la version courte:
requests.post('http://httpbin.org/post', json={'test': 'cheers'})
La meilleure façon est:
url = "http://xxx.xxxx.xx"
datas = {"cardno":"6248889874650987","systemIdentify":"s08","sourceChannel": 12}
headers = {'Content-type': 'application/json'}
rsp = requests.post(url, json=datas, headers=headers)
Fonctionne parfaitement avec python 3.5+
client:
import requests
data = {'sender': 'Alice',
'receiver': 'Bob',
'message': 'We did it!'}
r = requests.post("http://localhost:8080", json={'json_payload': data})
serveur:
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)
@cherrypy.tools.json_in()
@cherrypy.tools.json_out()
def POST(self):
self.content = cherrypy.request.json
return {'status': 'success', 'message': 'updated'}