При использовании requests
модуля можно ли распечатать необработанный HTTP-запрос?
Мне нужны не только заголовки, но и строка запроса, заголовки и распечатка содержимого. Можно ли увидеть, что в конечном итоге строится из HTTP-запроса?
python
http
python-requests
Huggie
источник
источник
requests
функцию, так как это означало бы переписывание / обходurllib3
иhttplib
. Смотрите трассировку стека нижеОтветы:
Начиная с версии 1.2.3, в запросы добавлен объект PreparedRequest. Согласно документации «он содержит точные байты, которые будут отправлены на сервер».
Это можно использовать для печати запроса, например, так:
который производит:
Затем вы можете отправить фактический запрос с этим:
Эти ссылки относятся к самой последней доступной документации, поэтому их содержание может измениться: Дополнительно - Подготовленные запросы и API - Классы более низкого уровня
источник
requests
вызываетresponse = requests.post(...)
(илиrequests.get
илиrequests.put
, и т. Д.) Методы, вы действительно можетеPreparedResponse
пройтиresponse.request
. Это может сэкономить на ручной обработкеrequests.Request
иrequests.Session
, если вам не нужен доступ к необработанным http-данным, прежде чем вы получите ответ.Я использую запросы версии 2.18.4 и Python 3
источник
Примечание: этот ответ устарел. Более новые версии
requests
поддерживают получение содержимого запроса напрямую, как ответные документы AntonioHerraizS .Невозможно получить истинное необработанное содержимое запроса
requests
, поскольку оно имеет дело только с объектами более высокого уровня, такими как заголовки и тип метода .requests
используетurllib3
для отправки запросов, ноurllib3
также не работает с необработанными данными - он используетhttplib
. Вот типичная трассировка стека запроса:Внутри
httplib
механизма мы видимHTTPConnection._send_request
косвенное использованиеHTTPConnection._send_output
, которое в итоге создает необработанный запрос и тело (если оно существует) и используетHTTPConnection.send
для их отправки по отдельности.send
наконец доходит до розетки.Поскольку для выполнения того, что вы хотите, нет никаких ловушек, в качестве последнего средства вы можете использовать обезьяну
httplib
для получения контента. Это хрупкое решение, и вам может понадобиться адаптировать его, если оноhttplib
будет изменено. Если вы намерены распространять программное обеспечение с использованием этого решения, вы можете рассмотреть возможность упаковки,httplib
а не использовать систему, что легко, поскольку это чистый модуль Python.Увы, без лишних слов, решение:
который дает результат:
источник
patch_send
после импорта вам не следует звонить несколько раз, только один разhttplib
Еще лучшей идеей является использование библиотекиques_toolbelt, которая может выводить как запросы, так и ответы в виде строк для печати на консоль. Он обрабатывает все сложные случаи с файлами и кодировками, которые вышеупомянутое решение не обрабатывает хорошо.
Это так просто, как это:
Источник: https://toolbelt.readthedocs.org/en/latest/dumputils.html.
Вы можете просто установить его, набрав:
источник
Вот код, который делает то же самое, но с заголовками ответа:
Я потратил много времени на поиски этого, поэтому оставляю это здесь, если кому-то нужно.
источник
Я использую следующую функцию для форматирования запросов. Это похоже на @AntonioHerraizS, за исключением того, что оно также красиво печатает JSON-объекты в теле и помечает все части запроса.
И у меня есть аналогичная функция для форматирования ответа:
источник
requests
поддерживает так называемые перехватчики событий (с 2.23 фактически есть толькоresponse
перехватчики). Хук может использоваться для запроса для печати полных данных пары запрос-ответ, включая эффективный URL, заголовки и тела, например:Запуск это печатает:
Вы можете изменить
res.text
на,res.content
если ответ является двоичным.источник