¿Cómo PUBLICAR datos JSON con solicitudes de Python?
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?
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'}
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)
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'})
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).files
Content-Type
Cuando Content-Type
sea application/x-www-form-urlencoded
, use data=
:
requests.post(url, data=json_obj)
Cuando Content-Type
es application/json
, puedes simplemente usarlo json=
o usarlo data=
y configurarlo Content-Type
tú mismo:
requests.post(url, json=json_obj)
requests.post(url, data=jsonstr, headers={"Content-Type":"application/json"})
Cuando Content-Type
es multipart/form-data
, se usa para cargar archivos, así que use files=
:
requests.post(url, files=xxxx)
La mejor manera es:
url = "http://xxx.xxxx.xx"
data = {
"cardno": "6248889874650987",
"systemIdentify": "s08",
"sourceChannel": 12
}
resp = requests.post(url, json=data)