Gibt es während der Verwendung des requests
Moduls eine Möglichkeit, die unformatierte HTTP-Anforderung zu drucken?
Ich möchte nicht nur die Überschriften, sondern auch die Anforderungszeile, die Überschriften und den Ausdruck des Inhalts. Ist es möglich zu sehen, was letztendlich aus einer HTTP-Anfrage aufgebaut ist?
python
http
python-requests
Huggie
quelle
quelle
requests
Feature zu integrieren , da es bedeuten würde, neu zu schreiben / zu umgehenurllib3
undhttplib
. Siehe die Stapelverfolgung untenAntworten:
Seit v1.2.3 Requests wurde das PreparedRequest-Objekt hinzugefügt. Gemäß der Dokumentation "enthält es die genauen Bytes, die an den Server gesendet werden".
Man kann dies verwenden, um eine Anfrage hübsch auszudrucken, wie folgt:
welches produziert:
Dann können Sie die eigentliche Anfrage damit senden:
Diese Links verweisen auf die neueste verfügbare Dokumentation, sodass sich der Inhalt ändern kann: Erweitert - Vorbereitete Anforderungen und API - Klassen niedrigerer Ebene
quelle
requests
ist unkompliziert, daher denke ich, dass dies die akzeptierte Antwort sein sollteresponse = requests.post(...)
(oderrequests.get
oderrequests.put
usw.) Methoden, können Sie tatsächlich das bekommenPreparedResponse
durchresponse.request
. Dies erspart Ihnen die manuelle Bearbeitungrequests.Request
undrequests.Session
wenn Sie nicht auf die http-Rohdaten zugreifen müssen, bevor Sie eine Antwort erhalten.Ich verwende Anfragen Version 2.18.4 und Python 3
quelle
Hinweis: Diese Antwort ist veraltet. Neuere Versionen von
requests
Unterstützung der Anforderung von Inhalten direkt bekommen, als AntonioHerraizS Antwort Dokumente .Es ist nicht möglich, den wahren Rohinhalt der Anforderung zu ermitteln
requests
, da nur Objekte höherer Ebene wie Header und Methodentyp behandelt werden .requests
wirdurllib3
zum Senden von Anfragen verwendet, behandelt aberurllib3
auch keine Rohdaten - es wird verwendethttplib
. Hier ist eine repräsentative Stapelverfolgung einer Anforderung:Innerhalb der
httplib
Maschinerie können wirHTTPConnection._send_request
indirekte Verwendungen sehenHTTPConnection._send_output
, die schließlich die Rohanforderung und den Hauptkörper (falls vorhanden) erstellen und verwendenHTTPConnection.send
, um sie separat zu senden.send
erreicht endlich die Steckdose.Da es keine Haken gibt, um das zu tun, was Sie wollen, können Sie als letzten Ausweg Affen-Patches erstellen
httplib
, um den Inhalt zu erhalten. Es ist eine fragile Lösung, und Sie müssen sie möglicherweise anpassen, wenn siehttplib
geändert wird. Wenn Sie beabsichtigen, Software mit dieser Lösung zu vertreiben, sollten Sie das Packenhttplib
anstelle des Systems in Betracht ziehen , was einfach ist, da es sich um ein reines Python-Modul handelt.Leider ohne weiteres die Lösung:
was die Ausgabe ergibt:
quelle
patch_send
mehrmals anrufen , nur einmal, nach dem Importhttplib
Eine noch bessere Idee ist die Verwendung der Bibliothek "request_toolbelt", mit der sowohl Anforderungen als auch Antworten als Zeichenfolgen ausgegeben werden können, die Sie auf der Konsole drucken können. Es behandelt alle schwierigen Fälle mit Dateien und Codierungen, die mit der obigen Lösung nicht gut behandelt werden.
So einfach ist das:
Quelle: https://toolbelt.readthedocs.org/en/latest/dumputils.html
Sie können es einfach installieren, indem Sie Folgendes eingeben:
quelle
Hier ist ein Code, der dasselbe macht, aber mit Antwortheadern:
Ich habe viel Zeit damit verbracht, danach zu suchen, also lasse ich es hier, wenn jemand es braucht.
quelle
Ich benutze die folgende Funktion, um Anfragen zu formatieren. Es ist wie bei @AntonioHerraizS, nur dass JSON-Objekte im Textkörper hübsch gedruckt werden und alle Teile der Anforderung beschriftet werden.
Und ich habe eine ähnliche Funktion, um die Antwort zu formatieren:
quelle
requests
unterstützt sogenannte Event-Hooks (ab 2.23 gibt es eigentlich nur noch Hooksresponse
). Der Hook kann für eine Anforderung verwendet werden, um die vollständigen Daten des Anforderungs-Antwort-Paares zu drucken, einschließlich der effektiven URL, Header und Textkörper, wie z.Wenn Sie es ausführen, wird Folgendes gedruckt:
Möglicherweise möchten Sie zu ändern
res.text
,res.content
wenn die Antwort binär ist.quelle