Как увидеть тело отправляемого POST-запроса?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При отладке интеграций, веб-сервисов и взаимодействий по протоколу HTTP часто возникает задача проанализировать точные данные, которые клиент отправляет на сервер в теле POST-запроса. Нередко разработчики сталкиваются с ситуацией, когда в инструментах отладки видны только заголовки (Headers) и ответ сервера, а само тело запроса кажется отсутствующим. Разберем подробно, почему так происходит и какими инструментами можно посмотреть передаваемые данные.

Просмотр тела запроса в инструментах разработчика браузера (DevTools)

Если запрос отправляется из браузера или веб-клиента 1С, проще всего воспользоваться встроенной панелью инструментов разработчика. Разберем по шагам, где именно располагаются отправляемые данные:

  1. Откроем панель разработчика (горячая клавиша F12 или сочетание Ctrl + Shift + I) и перейдем на вкладку Network («Сеть»).
  2. Выполним действие на странице, инициирующее отправку POST-запроса.
  3. Найдем нужную строку запроса в общем списке и выделим ее кликом мыши.
  4. В правой панели перейдем на вкладку Payload («Полезная нагрузка»). В современных версиях браузеров на базе Chromium тело запроса вынесено из вкладки заголовков именно сюда. В зависимости от типа содержимого здесь будет отображен JSON, XML или блок Form Data.
  5. Если необходимо увидеть исходный неформатированный текст запроса, нажмем на переключатель view source в правом верхнем углу блока полезной нагрузки.

Проанализируем частую причину, почему тело запроса может не отображаться: если перед основным POST-запросом отправляется предварительный CORS-запрос методом OPTIONS (Preflight), у него физически нет тела. В таком случае необходимо обратить внимание на следующий за ним запрос с методом POST.

Просмотр тела POST-запроса в сниффере трафика Fiddler

Сниффер трафика Fiddler выступает в роли локального прокси-сервера и позволяет перехватывать любые HTTP- и HTTPS-пакеты. Чтобы просмотреть отправленное тело, выполним следующие действия:

  1. В левой панели со списком сетевых сессий выберем интересующий нас запрос.
  2. В правой части окна перейдем на вкладку Inspectors. Обратим внимание, что верхняя часть инспектора отвечает за исходящий запрос к серверу, а нижняя — за входящий ответ.
  3. В верхней панели запроса перейдем на вкладку, соответствующую формату отправленных данных:
    • Raw — отображает весь запрос целиком в сыром текстовом виде (включая строку метода, все заголовки и тело после пустой строки);
    • TextView / JSON / XML — форматированное представление структуры передаваемых данных;
    • WebForms — разобранный список параметров для данных форм типов application/x-www-form-urlencoded и multipart/form-data.

Важное замечание по HTTPS: если запрос выполняется по защищенному протоколу, Fiddler по умолчанию увидит только туннель CONNECT без возможности прочитать зашифрованное тело. Чтобы расшифровать содержимое, перейдем в меню Tools -> Options -> HTTPS, включим флаг Decrypt HTTPS traffic и согласимся на установку корневого сертификата перехватчика в систему.

Перенаправление HTTP-трафика из 1С в Fiddler

Когда вызовы формируются программно на стороне платформы 1С:Предприятие (в контексте клиента или сервера), трафик отправляется напрямую в сеть и не попадает в браузер. Чтобы перехватить такие вызовы сниффером, перенаправим исходящие соединения 1С через локальный прокси-сервер Fiddler. Посмотрим на пример кода:


// Настраиваем прокси-сервер (по умолчанию Fiddler слушает порт 8888 на localhost)
ПроксиСервер = Новый HTTPПрокси;
ПроксиСервер.Установить("HTTP", "127.0.0.1", 8888);
ПроксиСервер.Установить("HTTPS", "127.0.0.1", 8888);

// Создаем защищенное соединение с использованием прокси
SSLЗащита = Новый ЗащищенноеСоединениеOpenSSL;
Соединение = Новый HTTPСоединение("api.service.com", 443, , , ПроксиСервер, , SSLЗащита);

Запрос = Новый HTTPЗапрос("/v1/endpoint");
Запрос.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Запрос.УстановитьТелоИзСтроки("{""status"": ""active""}", КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);

Ответ = Соединение.ОтправитьДляОбработки(Запрос);

Просмотр и логирование тела запроса средствами 1С

Если использование внешних снифферов ограничено политиками безопасности, мы можем получить и зафиксировать тело POST-запроса непосредственно в программном коде конфигурации 1С.

1. Для исходящих запросов: перед вызовом метода ОтправитьДляОбработки или ВызватьHTTPМетод прочитаем тело из объекта HTTPЗапрос:


ТелоДляЛога = Запрос.ПолучитьТелоКакСтроку();
ЗаписьЖурналаРегистрации("Отправка HTTP запроса", 
    УровеньЖурналаРегистрации.Информация, , , 
    "URL: " + Запрос.АдресРесурса + Символы.ПС + "Тело: " + ТелоДляЛога);

2. Для входящих запросов в HTTP-сервисах 1С: в методе-обработчике модуля HTTP-сервиса входящие данные извлекаются из переданного параметра типа HTTPСервисЗапрос:


Функция ОбработатьPOST(Запрос)
    
    // Получаем тело входящего POST-запроса в виде строки
    СтрокаТела = Запрос.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
    
    // При необходимости чтения двоичных данных (например, при передаче файлов)
    // ДвоичныеДанныеТела = Запрос.ПолучитьТелоКакДвоичныеДанные();
    
    ЗаписьЖурналаРегистрации("Входящий HTTP POST", 
        УровеньЖурналаРегистрации.Информация, , , 
        "Получено тело: " + СтрокаТела);
        
    Ответ = Новый HTTPСервисОтвет(200);
    Ответ.УстановитьТелоИзСтроки("{""result"": ""ok""}", КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
    Возврат Ответ;
    
КонецФункции

Таким образом, для анализа данных POST-запроса достаточно выбрать подходящий уровень перехвата: вкладку Payload в браузере для клиентских сценариев, вкладку Inspectors -> Raw/JSON в сниффере Fiddler для детального сетевого анализа или методы ПолучитьТелоКакСтроку() для встроенной отладки в коде 1С.

← На главную