requests peticiones libreria how headers example enviar descargar python json python-requests cherrypy

peticiones - request python example



Publicar JSON usando Python Requests (6)

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'': ''x.x.x.x'', ''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.

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 (no se muestra el código), pero cuando intento 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?


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


Esto funciona perfecto para Python Versión 3.5, si la URL contiene el valor de la cadena / parámetro de consulta,

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

Valor del parámetro = 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)


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


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)


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)