¿Cómo PUBLICAR datos JSON con solicitudes de Python?

Resuelto Charles R asked hace 12 años • 10 respuestas

Necesito PUBLICAR un JSON desde un cliente a un servidor. Estoy usando Python 2.7.1 y simplejson. El cliente está utilizando Solicitudes. El servidor es CherryPy. Puedo OBTENER un JSON codificado del servidor (el código no se muestra), pero cuando intento PUBLICAR un JSON en el servidor, aparece "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?

Charles R avatar Mar 16 '12 14:03 Charles R
Aceptado

A partir de la versión 2.4.2 de Requests, puede usar el json=parámetro (que toma un diccionario) en lugar de data=(que toma una cadena) en la llamada:

>>> 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'}
Zeyang Lin avatar Oct 13 '2014 16:10 Zeyang Lin

Resulta que me faltaba la información del encabezado. Las siguientes obras:

import requests

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)
Charles R avatar Mar 31 '2012 03:03 Charles R

A partir 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". Entonces la versión más corta:

requests.post('http://httpbin.org/post', json={'test': 'cheers'})
ZZY avatar Dec 10 '2014 10:12 ZZY

El parámetro entre data// que necesita usar depende del encabezado de solicitud denominado json( puede verificar esto a través de las herramientas de desarrollo de su navegador).filesContent-Type

Cuando Content-Typesea application/x-www-form-urlencoded, use data=:

requests.post(url, data=json_obj)

Cuando Content-Typees application/json, puedes simplemente usarlo json=o usarlo data=y configurarlo Content-Typetú mismo:

requests.post(url, json=json_obj)
requests.post(url, data=jsonstr, headers={"Content-Type":"application/json"})

Cuando Content-Typees multipart/form-data, se usa para cargar archivos, así que use files=:

requests.post(url, files=xxxx)
xiaoming avatar Apr 12 '2020 07:04 xiaoming

La mejor manera es:

url = "http://xxx.xxxx.xx"
data = {
    "cardno": "6248889874650987",
    "systemIdentify": "s08",
    "sourceChannel": 12
}
resp = requests.post(url, json=data)
ellen avatar May 04 '2017 07:05 ellen