При переходе от использования COM-объекта WinHttp.WinHttpRequest.5.1 к штатным средствам 1С (объектам HTTPСоединение и HTTPЗапрос) разработчики часто сталкиваются с ситуацией, когда сервер принимает соединение, но «не видит» переданных данных в теле запроса. Давайте разберем, почему это происходит и как исправить ситуацию, чтобы ваш код работал стабильно.
При работе через WinHttp многие заголовки запроса формируются автоматически. В частности, объект WinHttp самостоятельно вычисляет заголовок Host на основании адреса, переданного в метод Open. В свою очередь, штатный объект HTTPЗапрос в 1С ведет себя более строго: он не всегда автоматически добавляет заголовки, которые веб-сервер может считать обязательными для успешной обработки POST-данных.
Если сервер настроен на работу с виртуальными хостами или защищен системой фильтрации трафика (WAF), отсутствие заголовка Host или неверно указанный Content-Type приводит к тому, что запрос принимается, но его содержимое игнорируется или отбрасывается как некорректное.
Чтобы POST-запрос корректно обрабатывался на стороне сервера, необходимо явно передать все требуемые заголовки в коллекцию Заголовки объекта HTTPЗапрос. Практика показывает, что в большинстве случаев для JSON-запросов критически важны два заголовка: Host и Content-Type.
Рассмотрим, как правильно доработать код, чтобы сервер успешно принял ваши данные:
АдресСервиса = "my.com";
АдресРесурса = "/sync/start";
JSONstr = "{""guids"": [""f55ab18b-7fa8-11ea-aa9a-b2ce7d90c661""]}";
// Создаем объект HTTPЗапрос
HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса);
// Устанавливаем тело запроса
HTTPЗапрос.УстановитьТелоИзСтроки(JSONstr, "UTF-8");
// Добавляем обязательные заголовки, которые ожидает сервер
HTTPЗапрос.Заголовки.Вставить("Host", "my.com");
HTTPЗапрос.Заголовки.Вставить("Content-Type", "application/json");
// Выполняем запрос
HTTPСоединение = Новый HTTPСоединение(АдресСервиса, , , , , , Новый ЗащищенноеСоединениеOpenSSL);
Ответ = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
Если добавление заголовков не решило проблему, рекомендуем пройти по следующим шагам диагностики:
Accept или кастомные ключи авторизации.УстановитьТелоИзСтроки может добавлять служебные символы кодировки в начало строки. Некоторые веб-серверы чувствительны к этим байтам. Попробуйте явно отключить их использование:
HTTPЗапрос.УстановитьТелоИзСтроки(JSONstr, "UTF-8", ИспользованиеByteOrderMark.НеИспользовать);Fiddler или Charles. Запустив 1С через прокси, вы сможете увидеть «сырой» вид HTTP-запроса, который уходит из 1С, и сравнить его с тем, что отправляет Postman. Это самый быстрый способ найти недостающий или лишний символ в теле запроса.HTTPСоединение стабильно от версии к версии, всегда полезно проверять актуальные релизы платформы (например, 8.3.16 и выше), так как в них периодически вносятся улучшения по работе с защищенными соединениями (SSL/TLS).Главный урок при работе со штатными средствами 1С — это внимательное отношение к протоколу HTTP. В отличие от WinHttp, который «додумывает» параметры за программиста, штатные объекты 1С требуют точного указания всех сетевых параметров. Если вы столкнулись с пустым телом запроса, в первую очередь проверяйте заголовок Host и корректность Content-Type. В 90% случаев это решает проблему «тихого» отбрасывания данных сервером.