Просмотр HTTP-запроса Python: headers, requests, API PayPal
Быстрый ответ
Для включения HTTP-трассировки в Python достаточно установить значение http.client.HTTPConnection.debuglevel = 1
. Эта настройка позволяет контролировать содержание HTTP-запроса прямо в консоли. Пример кода с использованием библиотеки requests
может выглядеть так:
import http.client
http.client.HTTPConnection.debuglevel = 1
import requests
response = requests.get("http://example.com")
В результате в консоли появится информация о заголовках и теле запроса. Это особенно полезно при отладке. Помните, что в производственной среде данный метод следует использовать осторожно!
[AsideBanner]
Подробный анализ: что же вы увидите
Установка debuglevel = 1
для http.client.HTTPConnection
предоставляет вам следующую информацию:
- Строку запроса, например:
GET / HTTP/1.1
. - Заголовки запроса, такие как
Host: example.com
. - Содержимое тела запроса для методов, которые передают данные, например,
POST
.
Вы также сможете просмотреть полный ответ сервера, включая статус-коды, заголовки и тело.
Визуализация
Представьте HTTP-запрос в виде поезда, перевозящего данные. Наша задача – осмотреть каждый вагон, чтобы проверить, какая информация находится внутри.
Используем Python в качестве платформы для такого анализа:
import requests
response = requests.get('http://example.com')
Для просмотра деталей отправленного запроса обратите внимание на объект response.request
, в котором содержатся:
- Метод запроса.
- Заголовки.
- Тело запроса.
Именно это позволить вам просмотреть каждый "вагон" данных, отправленных вашим приложением.
Анализ сложных маршрутов
Если HTTP-запрос выполняет перенаправление, для получения информации об изменениях маршрута изучите response.request.history
.
Для анализа аутентификации обратите внимание на response.request.auth
, где хранятся данные для аутентификации.
Используйте хуки запросов как инструмент для подробной настройки и реагирования на события жизненного цикла запроса:
def logging_hook(response, *args, **kwargs):
print(response.request.headers)
print(response.request.body)
hooks = {"response": logging_hook}
response = requests.get("http://example.com", hooks=hooks)
Этот код позволяет вам мгновенно получить информацию о каждом запросе и ответе.
Более мощные инструменты для более глубокой работы
Если вы не желаете кодировать, вы можете использовать HTTP Toolkit
для визуального представления HTTP-трафика без необходимости написания кода.
Предпочитаете работать через командную строку? Используйте netcat
с командой nc -l 1234
.
mitmproxy
является отличным инструментом, позволяющим наблюдать и редактировать данные в реальном времени для глубокой отладки.
Логирование с высокой точностью
Для организации точного логирования HTTP-запросов настройте Python logging
вместе с requests
:
import logging
import requests
from http.client import HTTPConnection
log = logging.getLogger(__name__)
logging.basicConfig(level=logging.DEBUG)
requests_log = logging.getLogger("requests.packages.urllib3")
requests_log.setLevel(logging.DEBUG)
requests_log.propagate = True
HTTPConnection.debuglevel = 1
Правильно подобрав место для этого кода в вашем приложении, вы получите мощный инструмент для решения возникших проблем.
Логирование как делают это профессионалы
- Хорошо осведомлены о различных уровнях логирования: для целей разработки используйте уровень DEBUG, а для продакшена – уровни INFO или ERROR.
- Фильтруйте логи для уменьшения нежелательного "шума".
- Регулярно делайте очистку логов, чтобы избегать их чрезмерного накопления.
Лучший подход для вашего конкретного случая
Выбор инструмента для отладки зависит от ваших задач.
Для быстрой проверки вполне подойдет HTTPConnection.debuglevel
.
Для тонкой настройки внутри приложения используйте хуки запросов.
Если же вам необходим наглядный анализ без кодирования, выберите HTTP Toolkit
.
А для регулярного мониторинга и диагностики возникших проблем подходит функционал логирования.
Полезные материалы
- mitmproxy – интерактивный HTTPS-прокси
- Requests: HTTP для людей™ — документация Requests 2.31.0
- http.client — HTTP-клиент протокола — Документация Python 3.12.1
- Python requests – как отобразить полный HTTP-запрос (сырой формат)? – Stack Overflow
- Путеводитель по логированию в Python — Документация Python 3.12.1