Python-requests-Modul: urlencoding json-Daten
Arbeite ich an einer API-wrapper. Die Skillung, die ich versuche zu bauen, hat die folgende Anfrage:
curl -H "Content-type:application/json" -X POST -d data='{"name":"Partner13", "email":"[email protected]"}' http://localhost:5000/
Diese Anfrage erzeugt die folgende Antwort aus einem kleinen test-server-setup, um zu sehen, exatly was Kopf - /params etc verschickt. Dieses kleine script erzeugt:
uri: http://localhost:5000/,
method: POST,
api_key: None,
content_type: application/json,
params: None,
data: data={"name":"Partner13", "email":"[email protected]"}
So, oben ist das Ergebnis möchte ich mein python-Skript zu erstellen, wenn es Sie trifft die kleinen test-Skript.
Ich bin mit dem python-requests-Modul, welches die schönsten HTTP lib, die ich je benutzt habe. So, hier ist mein python-code:
uri = "http://localhost:5000/"
headers = {'content-type': 'application/json' }
params = {}
data = {"name":"Partner13", "email":"[email protected]"}
params["data"] = json.dumps(data)
r = requests.post(uri, data=params, headers=headers)
So einfach genug Zeug. Legen Sie die Header, und erstellen Sie ein Wörterbuch für die POST-Parameter. Das dictionary hat einen Eintrag mit der Bezeichnung "Daten", die den JSON-string an die Daten will ich an den server senden. Dann rufe ich den post. Allerdings ist das Ergebnis meiner kleinen test-Skript zurück gibt, ist:
uri: http://localhost:5000/,
method: POST,
api_key: None,
content_type: application/json,
params: None,
data: data=%7B%22name%22%3A+%22Partner13%22%2C+%22email%22%3A+%22example%40example.com%22%7D
Also im wesentlichen die json-Daten, die ich senden wollte unter die Daten-parameter wurde urlendcoded.
Weiß jemand, wie man dieses Problem beheben? Ich schaute durch die Anforderungen der Dokumentation und kann nicht scheinen zu finden ein Weg, um nicht auto urlencode die Daten senden.
Vielen Dank,
Kevin
InformationsquelleAutor kevin | 2013-04-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beim erzeugen des Objekts für die Daten-Schlüsselwort, einfach einer Variablen zuweisen das Ergebnis des json-Format.dumps(Daten).
Auch, da HTTP-POST akzeptiert der url-Parameter als auch Daten im body der Anfrage, und weil die Anforderungen.post-Funktion hat ein keyword argument namens "params", könnte es besser sein, verwenden Sie einen anderen Variablennamen für die Lesbarkeit. Die Anforderungen docs verwenden Sie die variable Namen "payload", also das, was ich.
InformationsquelleAutor John_GG
Anfragen automatisch URL-kodiert Wörterbücher übergeben Daten hier. John_GG ' s Lösung funktioniert, weil, anstatt, die Entsendung ein Wörterbuch mit den JSON-kodierten string in die 'Daten' - Feld es überschreitet einfach die JSON-kodierten string direkt: strings werden nicht automatisch kodiert. Ich kann nicht sagen, dass ich verstehen den Grund für dieses Verhalten in den Anfragen aber egal, es ist, was es ist. Es gibt keine Möglichkeit zum Umschalten dieses Verhalten aus, die ich finden kann.
Besten Glück mit es, Kevin.
Eigentlich ist diese wird verwendet, um codieren eines request-body als gut. Der call-stack ist so etwas wie
Request.init()
-->PreparedRequest.prepare()
-->PreparedRequest.prepare_body()
-->RequestEncodingMixin._encode_params()
. Dies scheint für die Behandlung von Anfragen mitapplication/x-www-form-urlencoded
Inhalte automatisch.InformationsquelleAutor minuteman3