Почему при отправке HTTP-запроса в 1С в URL появляется лишний порт или путь?

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

При интеграции 1С с внешними API часто возникают ситуации, когда запрос, сформированный платформой, возвращает ошибку или код состояния 302 Found. Одной из частых причин является некорректная сборка строки запроса, при которой в параметре Host или в самом пути запроса неожиданно появляется двоеточие с номером порта, например :443, либо дублируются сегменты URL. Давайте разберем, как правильно работать с объектами HTTPСоединение и HTTPЗапрос, чтобы избежать подобных проблем.

Разбираем причину ошибки

Проблема кроется в неправильном распределении данных между объектом HTTPСоединение и HTTPЗапрос. Когда мы передаем в конструктор HTTPСоединение строку, содержащую не только доменное имя, но и часть пути (например, mysite.ru/api/), платформа 1С пытается «склеить» эти данные. В результате парсер воспринимает содержимое после домена как часть структуры адреса, что приводит к появлению некорректных конструкций в заголовках HTTP-пакета.

Правильное формирование соединения

Чтобы избежать ошибок, необходимо строго придерживаться следующего правила: объект HTTPСоединение должен знать только «кто» (хост) и «куда» (порт), а объект HTTPЗапрос — «что именно» (ресурс и путь).

Рассмотрим по шагам правильную структуру кода:

  1. Параметр сервера: Указывайте только доменное имя (например, api.mysite.ru). Никаких слешей, протоколов https:// или вложенных путей типа /merchant/api/ здесь быть не должно.
  2. Порт: Используйте второй параметр конструктора HTTPСоединение для указания порта (для HTTPS это 443).
  3. Путь к ресурсу: Полный путь к API-методу должен быть указан исключительно в объекте HTTPЗапрос.

Пример корректного кода

Давайте посмотрим, как должен выглядеть исправленный код, который успешно выполнит отправку POST запроса:


// Правильная инициализация соединения: только хост и порт
Сервер = "api.mysite.ru";
Соединение = Новый HTTPСоединение(Сервер, 443, , , , , Новый ЗащищенноеСоединениеOpenSSL);

// Формирование заголовков
Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-type", "application/json");

// Формирование запроса: путь начинается со слеша и содержит полный маршрут
Ресурс = "/merchant/api/product/price/";
Запрос = Новый HTTPЗапрос(Ресурс, Заголовки);

// Подготовка тела запроса
МассивДанных = Новый Массив;
МассивДанных.Добавить(Новый Структура("barcode,priceOpt", "9002490206000", 98));
Запрос.УстановитьТелоИзСтроки(СериализоватьВJSONСтроку(МассивДанных));

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

Почему возникает 302 код ответа?

Получение кода 302 Found при работе с API сигнализирует о том, что сервер пытается перенаправить запрос. Часто это происходит из-за того, что сервер ожидает «чистый» путь без лишних сегментов, которые ошибочно добавляет 1С из-за неправильной настройки HTTPСоединение. Также проверьте наличие финального слеша в строке пути: некоторые API крайне чувствительны к этому символу.

Важные советы для отладки:

Следуя этим простым правилам разделения параметров, вы обеспечите стабильную и предсказуемую работу обменов данными с любыми внешними веб-сервисами.

← На главную