При интеграции 1С с внешними веб-сервисами разработчики часто сталкиваются с ситуацией, когда запрос успешно проходит в Postman, но возвращает ошибку 404 (Not Found) или 400 (Bad Request) при попытке выполнить его из программного кода. В этой статье мы подробно разберем, как правильно сформировать HTTP-запрос, настроить заголовки и передать тело в формате JSON, чтобы обеспечить стабильную работу обмена данными.
Рассмотрим типичную ситуацию: необходимо отправить поисковый запрос к сервису address.gu.proitr.ru. На первый взгляд код кажется логичным, однако использование стандартных настроек без учета специфики работы веб-серверов часто приводит к неудачам. Выясним основные причины, по которым сервер может вернуть ошибку 404 или некорректно обработать входящие данные:
application/x-www-form-urlencoded, маршрутизатор сервера может просто «не увидеть» параметры и решить, что запрос пуст или некорректен.УстановитьТелоИзСтроки("ТекстЗапроса") отправит на сервер буквально слово «ТекстЗапроса», а не содержимое JSON-строки./api/searchAll vs api/searchAll) может критично влиять на результат в зависимости от того, как настроено HTTPСоединение.Большинство современных сервисов работают по протоколу HTTPS. Для взаимодействия с ними в 1С необходимо использовать объект ЗащищенноеСоединениеOpenSSL. Проанализируем, как правильно инициализировать соединение:
// Создаем защищенное соединение для работы по HTTPS
Защита = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, Новый СертификатыУдостоверяющихЦентров());
// Указываем адрес сервера без протокола (без https://)
Сервер = "address.gu.proitr.ru";
Соединение = Новый HTTPСоединение(Сервер, , , , , , Защита);
Обратите внимание, что в параметрах HTTPСоединение мы не указываем путь к API — только доменное имя сервера. Если сервер требует работы через специфический порт, его следует указать вторым параметром (например, 443 для HTTPS).
Для передачи данных в формате JSON нам необходимо подготовить строку и правильно объявить тип контента в заголовках запроса. Разберем этот процесс по шагам. Вместо ручного формирования строки с кавычками, рекомендуется использовать сериализацию в JSON, но в простейших случаях допустимо и прямое формирование текста.
// Формируем тело запроса
ТекстЗапроса = "{""query"": ""улица Ленина""}";
// Устанавливаем обязательные заголовки
Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-Type", "application/json");
Заголовки.Вставить("Accept", "application/json"); // Сообщаем серверу, что хотим ответ в JSON
Важно помнить, что заголовок Content-Type со значением application/json является критически важным для REST-интерфейсов. Именно он сообщает серверу, как именно нужно парсить входящий поток байтов.
Теперь перейдем к самому ответственному моменту — созданию объекта HTTPЗапрос и установке его тела. Здесь мы применим метод УстановитьТелоИзСтроки, обязательно указав параметр отключения BOM. Посмотрим на правильную реализацию:
// Указываем путь к ресурсу. Попробуйте варианты со слешем и без, если сервер капризен.
Ресурс = "api/searchAll";
Запрос = Новый HTTPЗапрос(Ресурс, Заголовки);
// Передаем переменную ТекстЗапроса (БЕЗ КАВЫЧЕК!)
// ИспользованиеByteOrderMark.НеИспользовать - критически важно для JSON
Запрос.УстановитьТелоИзСтроки(ТекстЗапроса, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
Именно использование ИспользованиеByteOrderMark.НеИспользовать часто является «секретным ингредиентом», который превращает ошибку 400/404 в успешный ответ 200.
После подготовки запроса его необходимо отправить на сервер методом ОтправитьДляОбработки (который соответствует HTTP POST). Обязательно добавим проверку кода состояния ответа, чтобы понимать, успешно ли прошла операция.
Попытка
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Если Ответ.КодСостояния = 200 Тогда
// Обработка успешного ответа
СодержимоеОтвета = Ответ.ПолучитьТелоКакСтроку();
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СодержимоеОтвета);
Данные = ПрочитатьJSON(ЧтениеJSON, Ложь);
ЧтениеJSON.Закрыть();
// Теперь в переменной "Данные" находится структура или соответствие с результатом
Иначе
Сообщить("Ошибка выполнения запроса! Код состояния: " + Ответ.КодСостояния);
Сообщить("Текст ошибки: " + Ответ.ПолучитьТелоКакСтроку());
КонецЕсли;
Исключение
Сообщить("Не удалось установить соединение с сервером: " + ОписаниеОшибки());
КонецПопытки;
Если после выполнения всех инструкций запрос все еще возвращает ошибку, проанализируем следующие моменты:
SearchAll вместо searchAll).User-Agent или API-ключ.КодировкаТекста.UTF8 при установке тела запроса и получении ответа.Таким образом, мы выяснили, что успешный HTTP-запрос в 1С складывается из правильной настройки HTTPСоединение, корректного указания Content-Type, внимательного обращения с переменными в методе УстановитьТелоИзСтроки и обязательного отключения метки BOM. Соблюдение этих правил позволит вам избежать большинства трудностей при интеграции программных продуктов 1С с внешними информационными системами.