J'ai besoin de POSTER un JSON d'un client vers un serveur. J'utilise Python 2.7.1 et simplejson. Le client utilise des demandes. Le serveur est CherryPy. Je peux obtenir un JSON codé en dur à partir du serveur (code non illustré), mais lorsque j'essaye de POSTER un JSON sur le serveur, j'obtiens "400 Bad Request".
Voici mon code client:
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)
Voici le code du serveur.
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())
Des idées?
python
json
python-requests
cherrypy
Charles R
la source
la source
__init__
méthodes de classe avec uncontent
argument (et ne prétend pas le faire dans le lien que vous fournissez). Dans l'exemple détaillé qu'ils ont, l'utilisateur fournit le code qui appelle__init__
et fournit les arguments, que nous n'avons pas vu ici, donc je n'ai aucune idée de l'état dans lequel se trouve votre objet lorsque votre# this works
commentaire est pertinent.cherrypy.quickstart(Root(), '/', conf)
.Réponses:
À partir de Requests version 2.4.2 et suivantes, vous pouvez également utiliser le paramètre 'json' dans l'appel, ce qui le rend plus simple.
EDIT: Cette fonctionnalité a été ajoutée à la documentation officielle. Vous pouvez le consulter ici: Documentation des demandes
la source
json
paramètre. Je devais aller dans Github avant d'en voir la moindre mention: github.com/kennethreitz/requests/blob/…Il s'avère que je manquais les informations d'en-tête. Les oeuvres suivantes:
la source
application/json
dansGET
et en quelque sorte manqué que vous aviez pas fourni à la demande. Vous devrez peut-être également vous assurer que vous retournez quelque chosePOST
ou vous pourriez en obtenir un500
.r
, je reçois<Response [200]>
.json.dumps
ici. Ledata
paramètre derequests
fonctionne bien avec les dictionnaires. Pas besoin de convertir en chaîne.À partir des requêtes 2.4.2 ( https://pypi.python.org/pypi/requests ), le paramètre "json" est pris en charge. Pas besoin de spécifier "Content-Type". Donc, la version courte:
la source
La meilleure façon est:
la source
Content-type: application/json
est redondant comme l'json=
indique déjà cela.Content-type
text/html; charset=UTF-8
. Alors ci-dessus ne fonctionnera pas?Fonctionne parfaitement avec python 3.5+
client:
serveur:
la source
Quel paramètre entre (données / json / fichiers) doit être utilisé, cela dépend en fait d'un en-tête de requête nommé ContentType (vérifiez généralement cela via les outils de développement de votre navigateur),
lorsque le Content-Type est application / x-www-form-urlencoded, le code doit être:
lorsque le Content-Type est application / json, votre code est censé être l'un des suivants:
lorsque le Content-Type est multipart / form-data, il est utilisé pour télécharger des fichiers, donc votre code doit être:
la source