web-dev-qa-db-fra.com

Publier JSON à l'aide de Python Requests

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?

497
Charles R

À 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

806
Zeyang Lin

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)
326
Charles R

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'})
54
ZZY

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)
19
ellen

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'}
0
Ruhil Jaiswal