Question Publiez JSON en utilisant les requêtes Python


Je dois 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 du serveur (code non montré), mais quand j'essaye de POSTER un JSON au serveur, j'obtiens "400 Bad Request".

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?


344
2018-03-16 07:46


origine


Réponses:


À partir de la version 2.4.2 de Requests, vous pouvez également utiliser le paramètre 'json' dans l'appel, ce qui le rend plus simple.

>>> 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 voir ça ici: Demande de documentation


521
2017-10-13 16:08



Il se trouve que je manquais les informations d'en-tête. Les travaux suivants:

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)

272
2018-03-31 03:26



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 plus courte:

requests.post('http://httpbin.org/post', json={'test': 'cheers'})

40
2017-12-10 10:08



Le meilleur moyen 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)

5
2018-05-04 07:26



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
2018-01-20 21:10



Cela fonctionne parfaitement pour Python Version 3.5, Si l'URL contient la valeur Query String / Parameter,

Demande d'URL = https://bah2.com/ws/rest/v1/concept/ 

Valeur du paramètre = 21f6bb43-98a1-419d-8f0c-8133669e40ca

import requests
r = requests.post('https://bah2.com/ws/rest/v1/concept/21f6bb43-98a1-419d-8f0c-8133669e40ca',auth=('username', 'password'),verify=False, json={"name": "Value"})
headers = {'Content-type': 'application/json'}
print(r.status_code)

-1
2017-10-13 08:30