Das HTTP-POST-Anforderung mit Anforderungen in Python
Ich bin versucht, eine HTTP-Anforderung an eine API mit der POST-Methode. Die API, die ich verwende, ist gedacht, um in drei Parametern (key1, key2, key3) und wieder eine json-Datei. Leider ist meine POST-request scheint nicht zu etwas zurückkehren, wenn ich mit der Daten Methode, um an meinem Wörterbuch auf die API. Dies scheint sehr seltsam, weil es scheint zu funktionieren, wenn ich mit der params Methode. Ich kann nicht versuchen dies zu verstehen, wie dieser Prozess scheint zu sein, sehr undurchsichtig ist (z.B. kann ich eine URL, um zu sehen, wie die Nutzlast der an die API).
Meine Frage: Was mache ich hier falsch?
POST-Anfrage, wo die Parameter gesendet werden, die über die API mit Daten Methode:
import requests
url = 'http://example.com/API.php'
payload = {
'key1': '<<Contains very long json string>>',
'key2': 5,
'key3': 0
}
print len(str(payload)) # Prints 6717
r = requests.post(url, data=payload) << Note data is used here
print r.status_code # Prints 200
print r.text # Prints empty string
POST-request-code, wo die Parameter gesendet werden, die über die API mit der params Methode:
import requests
url = 'http://example.com/API.php'
payload = {
'key1': '<<Contains very long json string>>',
'key2': 5,
'key3': 0
}
print len(str(payload)) # Prints 6717
r = requests.post(url, params=payload) << Note here params is used here
print r.status_code # Prints 200
print r.text # Prints expected JSON results
Wenn Sie sich Fragen, warum ich würde gerne mit dem Daten Methode über params... ich versuche mich zu übergeben, andere Wörterbücher mit mehr Saiten und die params Methode nicht scheinen, es zu tun, weil ich bin immer FEHLER 414. Ich hatte gehofft, dass der Fehler konnte gelöst werden, indem Sie Daten.
Die API, die ich verwenden, wurde in PHP geschrieben.
Möglich, Duplikat der Unterschied zwischen "Daten" und "params" in Python-requests?
Es tut mir Leid. Im moment bin ich nicht ganz sicher darüber, wie die API in PHP geschrieben, die von meinem Kollegen. Allerdings war ich unter der Annahme, dass die API erwartet einen JSON. Ich habe versucht, das hinzufügen des folgenden headers der HTTP-Anforderung zusammen mit der Daten Methode:
headers = {'Content-Type': "application/json; charset=UTF-8"}
und headers = {'Content-Type': "multipart/form-data; charset=UTF-8"}
Sie schien nicht zu helfen. Ich hoffe, dass ich Ihre Frage beantwortet.
InformationsquelleAutor user2646237 | 2017-06-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kurze Antwort
Dies ist, weil params sendet die Parameter als Teil der http POST-Anforderung, während die Daten sendet Sie als Teil des Körpers der Anfrage. In Ihrem Fall: Sie rufen einfach die api mit params und Sie sind in Ordnung. Dies ist absolut normal (und erwartete) Verhalten.
Demonstration
Starten Sie einfach zwei befehlslinien. Auf den ersten, führen netcat:
nc -l 8888
. Auf der anderen Kommandozeile, ausführen von python:In der netcat-Seite, sehen wir die folgende Anfrage:
Versuchen Sie als Nächstes, den params Weg:
Netcat Berichte:
Beachten Sie die Unterschiede in der ersten und letzten Zeile.
Wie Sie Lesen können, von der Dokumentation (kursive Hervorhebung ist von mir):
Nein. Das ist völlig normales Verhalten in solchen Fällen. Die (http-server) API sieht nur auf den geposteten url und extrahiert die Parameter aus. Es wahrscheinlich ignoriert die Inhalte (Daten) von der post. Beiträge mit Daten sind Häufig, wenn Formulare hochladen mit Dateien. Das Formular gesendet wird, wie mit "params". Die Datei senden Sie mit "Daten".
Verwenden Sie einfach params, beim aufrufen der API. Ich ' ll fügen Sie diese auf meine Antwort, weil, die Antworten, dass das Letzte bisschen Ihre Frage
Ich arbeite mit mehreren Wörterbüchern, mit jeder repräsentiert ein Dokument. Ich sende jedem Wörterbuch zu den API-Prozess einige Informationen über das Dokument und die Ergebnisse zurückgeben. Mit params arbeitet für einige Wörterbücher und nicht für andere arbeiten. Zum Beispiel für ein Dokument
print len(str(payload))
Drucke 18563 - dies ist ganz klar eine sehr großes Wörterbuch. Wie können Sie erwarten, versuchen, um den HTTP-request mit params wirft wieder die folgende Fehlermeldung: 414 Anforderungs-URI Zu lang - The requested URL ' s length exceeds the capacity limit for this server.In diesem Fall, was Sie sehen sollten andere option, die diese API hat. RFC 2616 Staaten, dass es keine a-priori-Beschränkung auf uri Länge, so kommt es auf den webserver, Sie Hase sprechen. 8KB (8192 bytes) ist eine gemeinsame Grenze. Alles darüber hinaus, die Größe sollte anders gehandhabt werden, als alle, die Dokument-Daten in uri. Ohne mehr Kontext, alles, was ich vorschlagen kann, ist zu prüfen, die Dokumentation der API.
InformationsquelleAutor agtoever