Как правильно настроить POST-запрос из 1С к внешнему API и избежать ошибки 404

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

При интеграции 1С с внешними веб-сервисами разработчики часто сталкиваются с ситуацией, когда запрос успешно проходит в Postman, но возвращает ошибку 404 (Not Found) или 400 (Bad Request) при попытке выполнить его из программного кода. В этой статье мы подробно разберем, как правильно сформировать HTTP-запрос, настроить заголовки и передать тело в формате JSON, чтобы обеспечить стабильную работу обмена данными.

Анализ причин возникновения ошибок при HTTP-запросах

Рассмотрим типичную ситуацию: необходимо отправить поисковый запрос к сервису address.gu.proitr.ru. На первый взгляд код кажется логичным, однако использование стандартных настроек без учета специфики работы веб-серверов часто приводит к неудачам. Выясним основные причины, по которым сервер может вернуть ошибку 404 или некорректно обработать входящие данные:

  1. Неправильный Content-Type: Если сервер ожидает JSON, а мы передаем application/x-www-form-urlencoded, маршрутизатор сервера может просто «не увидеть» параметры и решить, что запрос пуст или некорректен.
  2. Передача строкового литерала вместо переменной: Распространенная ошибка начинающих — использование кавычек там, где должна быть переменная. Метод УстановитьТелоИзСтроки("ТекстЗапроса") отправит на сервер буквально слово «ТекстЗапроса», а не содержимое JSON-строки.
  3. Метка BOM (Byte Order Mark): По умолчанию 1С добавляет в начало строки UTF-8 невидимые символы (BOM). Многие современные парсеры JSON (на Node.js, Go или Python) не умеют их обрабатывать, что вызывает сбои на стороне сервера.
  4. Формирование пути (URI): Наличие или отсутствие ведущего слеша в адресе ресурса (/api/searchAll vs api/searchAll) может критично влиять на результат в зависимости от того, как настроено HTTPСоединение.

Шаг 1: Настройка защищенного соединения

Большинство современных сервисов работают по протоколу HTTPS. Для взаимодействия с ними в 1С необходимо использовать объект ЗащищенноеСоединениеOpenSSL. Проанализируем, как правильно инициализировать соединение:


// Создаем защищенное соединение для работы по HTTPS
Защита = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, Новый СертификатыУдостоверяющихЦентров());

// Указываем адрес сервера без протокола (без https://)
Сервер = "address.gu.proitr.ru";
Соединение = Новый HTTPСоединение(Сервер, , , , , , Защита);

Обратите внимание, что в параметрах HTTPСоединение мы не указываем путь к API — только доменное имя сервера. Если сервер требует работы через специфический порт, его следует указать вторым параметром (например, 443 для HTTPS).

Шаг 2: Формирование структуры JSON и заголовков

Для передачи данных в формате JSON нам необходимо подготовить строку и правильно объявить тип контента в заголовках запроса. Разберем этот процесс по шагам. Вместо ручного формирования строки с кавычками, рекомендуется использовать сериализацию в JSON, но в простейших случаях допустимо и прямое формирование текста.


// Формируем тело запроса
ТекстЗапроса = "{""query"": ""улица Ленина""}";

// Устанавливаем обязательные заголовки
Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-Type", "application/json");
Заголовки.Вставить("Accept", "application/json"); // Сообщаем серверу, что хотим ответ в JSON

Важно помнить, что заголовок Content-Type со значением application/json является критически важным для REST-интерфейсов. Именно он сообщает серверу, как именно нужно парсить входящий поток байтов.

Шаг 3: Создание объекта HTTPЗапрос и передача тела

Теперь перейдем к самому ответственному моменту — созданию объекта HTTPЗапрос и установке его тела. Здесь мы применим метод УстановитьТелоИзСтроки, обязательно указав параметр отключения BOM. Посмотрим на правильную реализацию:


// Указываем путь к ресурсу. Попробуйте варианты со слешем и без, если сервер капризен.
Ресурс = "api/searchAll";
Запрос = Новый HTTPЗапрос(Ресурс, Заголовки);

// Передаем переменную ТекстЗапроса (БЕЗ КАВЫЧЕК!)
// ИспользованиеByteOrderMark.НеИспользовать - критически важно для JSON
Запрос.УстановитьТелоИзСтроки(ТекстЗапроса, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);

Именно использование ИспользованиеByteOrderMark.НеИспользовать часто является «секретным ингредиентом», который превращает ошибку 400/404 в успешный ответ 200.

Шаг 4: Выполнение запроса и обработка результата

После подготовки запроса его необходимо отправить на сервер методом ОтправитьДляОбработки (который соответствует HTTP POST). Обязательно добавим проверку кода состояния ответа, чтобы понимать, успешно ли прошла операция.


Попытка
    Ответ = Соединение.ОтправитьДляОбработки(Запрос);
    
    Если Ответ.КодСостояния = 200 Тогда
        // Обработка успешного ответа
        СодержимоеОтвета = Ответ.ПолучитьТелоКакСтроку();
        
        ЧтениеJSON = Новый ЧтениеJSON;
        ЧтениеJSON.УстановитьСтроку(СодержимоеОтвета);
        Данные = ПрочитатьJSON(ЧтениеJSON, Ложь);
        ЧтениеJSON.Закрыть();
        
        // Теперь в переменной "Данные" находится структура или соответствие с результатом
    Иначе
        Сообщить("Ошибка выполнения запроса! Код состояния: " + Ответ.КодСостояния);
        Сообщить("Текст ошибки: " + Ответ.ПолучитьТелоКакСтроку());
    КонецЕсли;
Исключение
    Сообщить("Не удалось установить соединение с сервером: " + ОписаниеОшибки());
КонецПопытки;

Дополнительные рекомендации по отладке

Если после выполнения всех инструкций запрос все еще возвращает ошибку, проанализируем следующие моменты:

Таким образом, мы выяснили, что успешный HTTP-запрос в 1С складывается из правильной настройки HTTPСоединение, корректного указания Content-Type, внимательного обращения с переменными в методе УстановитьТелоИзСтроки и обязательного отключения метки BOM. Соблюдение этих правил позволит вам избежать большинства трудностей при интеграции программных продуктов 1С с внешними информационными системами.

← На главную