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 uncontentargumento (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 workscomentario 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
jsonpará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/jsonenGETy de alguna manera echado de menos que no había proporcionado en la solicitud. También es posible que deba asegurarse de que devuelve algoPOSTo podría recibir un500.r, me sale<Response [200]>.json.dumpsaquí. Eldataparámetro derequestsfunciona 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/jsones redundante como eljson=ya insinúa eso.Content-typetext/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