Publicar JSON usando Python Requests

Necesito enviar un JSON de un cliente a un servidor. Estoy usando Python 2.7.1 y simplejson. El cliente está utilizando peticiones. El servidor es CherryPy. Puedo obtener un JSON codificado en el servidor (el código no se muestra), pero cuando bash enviar un JSON al servidor, obtengo “400 Solicitud incorrecta”.

Aquí está mi código de cliente:

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) 

Aquí está el código del servidor.

 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()) 

¿Algunas ideas?

A partir de las Solicitudes de la versión 2.4.2 y posteriores, también puede usar el parámetro ‘json’ en la llamada, lo que lo hace más 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': 'xxxx', 'url': 'http://httpbin.org/post'} 

EDITAR: Esta característica ha sido añadida a la documentación oficial. Puedes verlo aquí: Solicitud de documentación.

Resulta que me faltaba la información del encabezado. Los siguientes trabajos:

 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) 

De las solicitudes 2.4.2 ( https://pypi.python.org/pypi/requests ), se admite el parámetro “json”. No es necesario especificar “Tipo de contenido”. Así que la versión más corta:

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

La mejor manera es :

 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) 

Funciona perfectamente con python 3.5+

cliente:

 import requests data = {'sender': 'Alice', 'receiver': 'Bob', 'message': 'We did it!'} r = requests.post("http://localhost:8080", json={'json_payload': data}) 

servidor:

 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'} 

Esto funciona perfecto para Python Versión 3.5, si la URL contiene el valor de la Cadena / Parámetro de la Consulta,

URL de solicitud = https://baaaah2.com/ws/rest/v1/concept/

Valor del parámetro = 21f6bb43-98a1-419d-8f0c-8133669e40ca

 import requests r = requests.post('https://baaaah2.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)