При отладке интеграций, веб-сервисов и взаимодействий по протоколу HTTP часто возникает задача проанализировать точные данные, которые клиент отправляет на сервер в теле POST-запроса. Нередко разработчики сталкиваются с ситуацией, когда в инструментах отладки видны только заголовки (Headers) и ответ сервера, а само тело запроса кажется отсутствующим. Разберем подробно, почему так происходит и какими инструментами можно посмотреть передаваемые данные.
Если запрос отправляется из браузера или веб-клиента 1С, проще всего воспользоваться встроенной панелью инструментов разработчика. Разберем по шагам, где именно располагаются отправляемые данные:
Проанализируем частую причину, почему тело запроса может не отображаться: если перед основным POST-запросом отправляется предварительный CORS-запрос методом OPTIONS (Preflight), у него физически нет тела. В таком случае необходимо обратить внимание на следующий за ним запрос с методом POST.
Сниффер трафика Fiddler выступает в роли локального прокси-сервера и позволяет перехватывать любые HTTP- и HTTPS-пакеты. Чтобы просмотреть отправленное тело, выполним следующие действия:
application/x-www-form-urlencoded и multipart/form-data.Важное замечание по HTTPS: если запрос выполняется по защищенному протоколу, Fiddler по умолчанию увидит только туннель CONNECT без возможности прочитать зашифрованное тело. Чтобы расшифровать содержимое, перейдем в меню Tools -> Options -> HTTPS, включим флаг Decrypt HTTPS traffic и согласимся на установку корневого сертификата перехватчика в систему.
Когда вызовы формируются программно на стороне платформы 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.НеИспользовать);
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Если использование внешних снифферов ограничено политиками безопасности, мы можем получить и зафиксировать тело 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С.