Necesito PUBLICAR un JSON de 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 desde el servidor (no se muestra el código), pero cuando intento PUBLICAR un JSON en el servidor, obtengo "400 Bad Request".
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?
python
json
python-requests
cherrypy
Charles R
fuente
fuente
__init__
métodos de clase con uncontent
argumento (y no afirma en el enlace que proporciona). En el ejemplo detallado que tienen, el usuario proporciona el código que llama__init__
y proporciona los argumentos, que no hemos visto aquí, así que no tengo idea de en qué estado se encuentra su objeto cuando su# this works
comentario es relevante.cherrypy.quickstart(Root(), '/', conf)
.Respuestas:
A partir de la versión 2.4.2 de Solicitudes en adelante, también puede usar el parámetro 'json' en la llamada, lo que lo hace más simple.
EDITAR: Esta característica se ha agregado a la documentación oficial. Puede verlo aquí: Solicitud de documentación
fuente
json
parámetro. Tuve que ir a Github antes de ver alguna mención al respecto: github.com/kennethreitz/requests/blob/…Resulta que me faltaba la información del encabezado. Los siguientes trabajos:
fuente
application/json
enGET
y de alguna manera echado de menos que no había proporcionado en la solicitud. También es posible que deba asegurarse de que devuelve algoPOST
o podría recibir un500
.r
, me sale<Response [200]>
.json.dumps
aquí. Eldata
parámetro derequests
funciona bien con los diccionarios. No es necesario convertir a una cadena.Desde las solicitudes 2.4.2 ( https://pypi.python.org/pypi/requests ), se admite el parámetro "json". No es necesario especificar "Content-Type". Entonces la versión más corta:
fuente
La mejor manera es:
fuente
Content-type: application/json
es redundante como eljson=
ya insinúa eso.Content-type
text/html; charset=UTF-8
? ¿Entonces arriba no funcionará?Funciona perfectamente con python 3.5+
cliente:
servidor:
fuente
El parámetro entre (datos / json / archivos) debe usarse, en realidad depende de un encabezado de solicitud llamado ContentType (generalmente verifique esto a través de las herramientas de desarrollador de su navegador),
cuando Content-Type es application / x-www-form-urlencoded, el código debe ser:
cuando Content-Type es application / json, se supone que su código es uno de los siguientes:
cuando Content-Type es multipart / form-data, se usa para cargar archivos, por lo que su código debe ser:
fuente