Ich muss einen JSON von einem Client auf einen Server POSTEN. Ich benutze Python 2.7.1 und simplejson. Der Client verwendet Requests. Der Server ist CherryPy. Ich kann einen fest codierten JSON vom Server abrufen (Code nicht gezeigt), aber wenn ich versuche, einen JSON auf den Server zu POSTEN, erhalte ich "400 Bad Request".
Hier ist mein Kundencode:
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)
Hier ist der Servercode.
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())
Irgendwelche Ideen?
python
json
python-requests
cherrypy
Charles R.
quelle
quelle
__init__
mit einemcontent
Argument auf (und beansprucht dies nicht in dem von Ihnen angegebenen Link). In dem detaillierten Beispiel, das sie haben, gibt der Benutzer den Code an, der aufruft,__init__
und liefert die Argumente, die wir hier nicht gesehen haben, sodass ich keine Ahnung habe, in welchem Zustand sich Ihr Objekt befindet, wenn Ihr# this works
Kommentar relevant ist.cherrypy.quickstart(Root(), '/', conf)
.Antworten:
Ab Requests Version 2.4.2 können Sie alternativ den Parameter 'json' im Aufruf verwenden, um dies zu vereinfachen.
BEARBEITEN: Diese Funktion wurde der offiziellen Dokumentation hinzugefügt. Sie können es hier anzeigen: Anforderungsdokumentation
quelle
json
Parameter enthält absolut nichts . Ich musste nach Github, bevor ich eine Erwähnung sah: github.com/kennethreitz/requests/blob/…Es stellte sich heraus, dass mir die Header-Informationen fehlten. Folgendes funktioniert:
quelle
application/json
inGET
und irgendwie verpasst , dass man es nicht zur Verfügung gestellt hatte auf den Antrag. Möglicherweise müssen Sie auch sicherstellen, dass Sie etwas von zurückgeben,POST
oder Sie erhalten möglicherweise eine500
.r
, bekomme ich<Response [200]>
.json.dumps
hier. Derdata
Parameter vonrequests
funktioniert gut mit Wörterbüchern. Keine Konvertierung in einen String erforderlich.Ab den Anforderungen 2.4.2 ( https://pypi.python.org/pypi/requests ) wird der Parameter "json" unterstützt. Es ist nicht erforderlich, "Inhaltstyp" anzugeben. Also die kürzere Version:
quelle
Der bessere Weg ist:
quelle
Content-type: application/json
ist überflüssig wie dasjson=
schon andeutet.Content-type
text/html; charset=UTF-8
. Dann funktioniert oben nicht?Funktioniert perfekt mit Python 3.5+
Klient:
Server:
quelle
Welcher Parameter zwischen (data / json / files) verwendet werden soll, hängt tatsächlich von einem Anforderungsheader mit dem Namen ContentType ab (überprüfen Sie dies normalerweise über die Entwicklertools Ihres Browsers).
Wenn der Inhaltstyp application / x-www-form-urlencoded ist, sollte der Code wie folgt lauten:
Wenn der Inhaltstyp application / json ist, sollte Ihr Code einer der folgenden sein:
Wenn der Inhaltstyp mehrteilig / Formulardaten ist, wird er zum Hochladen von Dateien verwendet. Ihr Code sollte also wie folgt lauten:
quelle