Как правильно передать параметры в POST-запросе к HTTP-сервису 1С

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

При разработке интеграций через HTTP-сервисы в 1С начинающие разработчики часто сталкиваются с ошибкой 404 Not Found при попытке передать параметры в POST-запросе. Рассмотрим основные причины возникновения этой проблемы и разберем три способа передачи данных, которые позволяют корректно настроить взаимодействие между системами.

Разбор причины ошибки 404 при использовании шаблонов

Выясним причину, по которой запрос автора темы возвращал ошибку 404. В конфигурации 1С был задан шаблон URL следующего вида:

/LoadMessageFromKIS/{MessageNo}/{ReceivedNo}

Однако вызов сервиса производился строкой:

zup3_test/hs/ExchangeKIS/LoadMessageFromKIS/?MessageNo=6&ReceivedNo=0

Проанализируем ситуацию: платформа 1С воспринимает части пути, заключенные в фигурные скобки {}, как обязательные сегменты URL. В данном случае система ожидает, что после LoadMessageFromKIS/ в адресе будут идти еще два сегмента, разделенных слешем. Но в запросе автора после названия метода стоит знак вопроса ?, который инициирует передачу параметров запроса (Query Parameters). Для платформы эти два адреса абсолютно разные, поэтому она не находит подходящий обработчик и возвращает 404.

Способ 1: Использование параметров в сегментах URL (Path Parameters)

Если мы хотим оставить текущий шаблон в базе-приемнике без изменений, нам необходимо привести строку вызова в соответствие с этим шаблоном. Разберем, как сформировать правильный запрос на стороне отправителя:


// Правильное формирование пути согласно шаблону /{MessageNo}/{ReceivedNo}
ПутьКРесурсу = "zup3_test/hs/ExchangeKIS/LoadMessageFromKIS/" 
               + Узел_ЗУП3.НомерОтправленного + "/" 
               + Узел_ЗУП3.НомерПринятого;

ЗапросHTTP = Новый HTTPЗапрос(ПутьКРесурсу, ЗаголовокЗапросаHTTP);
// В POST-запросе тело обычно заполняется, даже если параметры в URL
ЗапросHTTP.УстановитьТелоИзСтроки("{}"); 

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

На стороне сервера (в базе-приемнике) значения из фигурных скобок следует получать через коллекцию ПараметрыURL:


МесседжНом = Запрос.ПараметрыURL.Получить("MessageNo");
РесиведНом = Запрос.ПараметрыURL.Получить("ReceivedNo");

Способ 2: Использование параметров запроса (Query Parameters)

Рассмотрим альтернативный вариант: передачу параметров через знак вопроса. Это удобно, когда параметров много или они являются необязательными. Чтобы этот способ заработал, необходимо удалить сегменты в фигурных скобках из шаблона в конфигураторе.

Новый шаблон в 1С:

/LoadMessageFromKIS

Теперь обращение по адресу .../LoadMessageFromKIS/?MessageNo=6&ReceivedNo=0 будет успешно обработано. В коде обработчика на сервере получение данных изменится:


// Используем коллекцию ПараметрыЗапроса вместо ПараметрыURL
МесседжНом = Запрос.ПараметрыЗапроса.Получить("MessageNo");
РесиведНом = Запрос.ПараметрыЗапроса.Получить("ReceivedNo");

Преимущество этого метода: вы можете изменять состав передаваемых параметров, добавлять новые или удалять старые, не меняя структуру шаблонов в метаданных конфигурации.

Способ 3: Передача параметров в теле POST-запроса (Best Practice)

Для метода POST наиболее правильным и профессиональным подходом считается передача данных внутри тела запроса, обычно в формате JSON. Это позволяет скрывать технические данные из URL, передавать сложные структуры (массивы, вложенные объекты) и избегать проблем с длиной строки запроса.

Разберем по шагам реализацию этого подхода. Сначала подготовим данные на стороне отправителя:


// Формируем структуру с данными
ДанныеЗапроса = Новый Структура;
ДанныеЗапроса.Вставить("MessageNo", Узел_ЗУП3.НомерОтправленного);
ДанныеЗапроса.Вставить("ReceivedNo", Узел_ЗУП3.НомерПринятого);

// Сериализуем в JSON
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ДанныеЗапроса);
СтрокаJSON = ЗаписьJSON.Закрыть();

// Формируем запрос
ЗапросPOST = Новый HTTPЗапрос("/zup3_test/hs/ExchangeKIS/LoadMessageFromKIS/");
ЗапросPOST.Заголовки.Вставить("Content-Type", "application/json");

// Важно: отключаем BOM, чтобы сторонние системы или строгие парсеры не выдали ошибку 400
ЗапросPOST.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);

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

На стороне сервера (в базе-приемнике) мы считываем тело запроса и преобразуем его обратно в структуру:


// Читаем тело запроса
СтрокаТела = Запрос.ПолучитьТелоКакСтроку();

ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтрокаТела);
Данные = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();

МесседжНом = Данные.MessageNo;
РесиведНом = Данные.ReceivedNo;

Важные технические нюансы работы с HTTP-сервисами

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

  1. Byte Order Mark (BOM): При использовании метода УстановитьТелоИзСтроки() всегда явно указывайте ИспользованиеByteOrderMark.НеИспользовать. Многие современные веб-серверы (например, на Python или Go) воспринимают невидимый символ BOM в начале JSON-пакета как ошибку синтаксиса и возвращают 400 Bad Request.
  2. Заголовки (Headers): Обязательно передавайте заголовок Content-Type: application/json. Без него сервер может некорректно интерпретировать кодировку или формат входящих данных.
  3. Коды ответа: Не ограничивайтесь только кодом 200. Если в результате POST-запроса вы создали объект в базе, хорошим тоном будет вернуть код 201 Created. Если параметры не прошли валидацию — 400 Bad Request.
  4. Передача больших данных: Если через POST-запрос передаются файлы или очень большие объемы текста, вместо ПолучитьТелоКакСтроку() используйте Запрос.ПолучитьТелоКакПоток(). Это позволит обрабатывать данные порциями, не перегружая оперативную память сервера.
  5. Настройки веб-сервера (IIS/Apache): Если вы все настроили верно в 1С, но все равно получаете 404 или 405, проверьте настройки публикации на веб-сервере. Убедитесь, что для расширения 1С (isapi или модуль apache) разрешены соответствующие глаголы (POST, PUT, DELETE).

Проанализировав все способы, можно сделать вывод: использование сегментов URL (Способ 1) подходит для получения конкретного ресурса по его ID, тогда как передача данных в теле (Способ 3) является стандартом для отправки команд и больших наборов данных в современных API.

← На главную