Czy podczas korzystania z requests
modułu można wydrukować nieprzetworzone żądanie HTTP?
Nie chcę tylko nagłówków, chcę wiersz żądania, nagłówki i wydruk zawartości. Czy można zobaczyć, co ostatecznie skonstruowane jest z żądania HTTP?
python
http
python-requests
huggie
źródło
źródło
requests
funkcję, ponieważ oznaczałoby to przepisywanie / pomijanieurllib3
ihttplib
. Zobacz ślad stosu poniżejOdpowiedzi:
Od Żądań 1.2.3 dodano obiekt PreparedRequest. Zgodnie z dokumentacją „zawiera dokładne bajty, które zostaną wysłane na serwer”.
Można to wykorzystać do wydrukowania żądania, na przykład:
który produkuje:
Następnie możesz wysłać faktyczne żądanie za pomocą:
Te linki prowadzą do najnowszej dostępnej dokumentacji, więc mogą ulec zmianie w treści: Zaawansowane - Przygotowane żądania i API - Klasy niższego poziomu
źródło
requests
jest prosta, więc myślę, że powinna to być akceptowana odpowiedźresponse = requests.post(...)
(lubrequests.get
czyrequests.put
, etc) metody, można rzeczywiście uzyskaćPreparedResponse
throughresponse.request
. Może zaoszczędzić pracy ręcznego manipulowaniarequests.Request
irequests.Session
, jeśli nie musisz uzyskiwać dostępu do surowych danych http przed otrzymaniem odpowiedzi.Korzystam z żądań w wersji 2.18.4 i Python 3
źródło
Uwaga: ta odpowiedź jest nieaktualna. Nowsze wersje
requests
wsparcia pobierają bezpośrednio treść żądania, jako dokumenty odpowiedzi AntonioHerraizS .Nie można uzyskać prawdziwej surowej treści żądania
requests
, ponieważ dotyczy ona tylko obiektów wyższego poziomu, takich jak nagłówki i typ metody .requests
używaurllib3
do wysyłania żądań, aleurllib3
także nie zajmuje się surowymi danymi - używahttplib
. Oto reprezentatywny ślad stosu żądania:Wewnątrz
httplib
maszyny widzimyHTTPConnection._send_request
pośrednio zastosowaniaHTTPConnection._send_output
, które ostatecznie tworzą surowe żądanie i treść (jeśli istnieje), i wykorzystujeHTTPConnection.send
je do wysłania osobno.send
w końcu dociera do gniazda.Ponieważ nie ma żadnych haczyków do robienia tego, co chcesz, w ostateczności możesz małpować łatkę,
httplib
aby uzyskać zawartość. Jest to delikatne rozwiązanie i może być konieczne dostosowanie go, jeślihttplib
zostanie zmienione. Jeśli zamierzasz dystrybuować oprogramowanie za pomocą tego rozwiązania, możesz rozważyć pakowaniehttplib
zamiast korzystania z systemu, co jest łatwe, ponieważ jest to czysty moduł python.Niestety, bez zbędnych ceregieli rozwiązanie:
co daje wynik:
źródło
patch_send
wiele razy, tylko raz, po zaimportowaniuhttplib
Jeszcze lepszym pomysłem jest użycie biblioteki Request_toolbelt, która może zrzucić zarówno żądania, jak i odpowiedzi jako ciągi do wydrukowania na konsoli. Obsługuje wszystkie trudne sprawy z plikami i kodowaniami, które powyższe rozwiązanie nie obsługuje dobrze.
To takie proste:
Źródło: https://toolbelt.readthedocs.org/en/latest/dumputils.html
Możesz go po prostu zainstalować, wpisując:
źródło
Oto kod, który robi to samo, ale z nagłówkami odpowiedzi:
Spędziłem dużo czasu na szukaniu tego, więc zostawiam to tutaj, jeśli ktoś potrzebuje.
źródło
Korzystam z następującej funkcji do formatowania żądań. To jest jak @AntonioHerraizS, tyle że ładnie wydrukuje również obiekty JSON w ciele i oznaczy wszystkie części żądania.
Mam podobną funkcję do sformatowania odpowiedzi:
źródło
requests
obsługuje tak zwane haki zdarzeń (od 2.23 tak naprawdę jest tylkoresponse
hak). Haka można użyć na żądanie, aby wydrukować pełne dane pary żądanie-odpowiedź, w tym efektywny adres URL, nagłówki i treści, takie jak:Uruchamianie drukuje:
Może chcesz zmienić
res.text
, abyres.content
jeśli odpowiedź jest binarny.źródło