При интеграции 1С со сторонними веб-сервисами часто возникает необходимость выполнять авторизацию по API. Однако разработчики сталкиваются с ситуациями, когда вместо ожидаемого успешного ответа сервер возвращает ошибки с кодами 404 Not Found, 501 Not Implemented или сообщения об ошибках разбора тела запроса (например, unexpected token). Рассмотрим подробнее причины таких сбоев и разберем правильный алгоритм отправки POST-запросов из 1С.
Проанализируем первую частую ошибку. Если сервер ожидает данные авторизации через HTTP-метод POST по конкретному URL, а клиент отправляет GET-запрос, веб-сервер может вернуть ошибку 404 страница не найдена, поскольку маршрут для обработки GET-запросов по данному адресу не зарегистрирован.
В коде 1С за отправку GET-запроса отвечает метод Получить() объекта HTTPСоединение. Если вызвать его с телом запроса, сервер либо проигнорирует тело, либо вернет ошибку адресации.
Для выполнения POST-запросов в 1С следует использовать специализированные методы:
ОтправитьДляОбработки() объекта HTTPСоединение.ВызватьHTTPМетод("POST", Запрос), который считается более современным и стандартизированным подходом.Посмотрим на пример правильного вызова отправки POST-запроса:
// Создаем соединение
Соединение = Новый HTTPСоединение("www.example.com", 80, , , , 30);
// Подготавливаем запрос
АдресURL = "/api/workstation/clients/login";
Запрос = Новый HTTPЗапрос(АдресURL);
// Отправляем POST-запрос
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
// Или с помощью универсального метода:
// Ответ = Соединение.ВызватьHTTPМетод("POST", Запрос);
Выясним причину следующей распространенной проблемы. Даже после переключения на метод POST сервер может вернуть ошибку синтаксического анализа JSON с сообщением вида unexpected token at '?...'.
Символ ? (или служебный символ \uFEFF) в начале строки появляется из-за того, что платформа 1С по умолчанию добавляет маркер последовательности байтов (Byte Order Mark, BOM) при кодировании текста в UTF-8. Многие REST API не умеют обрабатывать BOM и воспринимают его как невалидный символ перед открывающей скобкой JSON.
Чтобы исключить попадание маркера BOM в запрос, при вызове метода УстановитьТелоИзСтроки() необходимо явно указывать третий параметр ИспользованиеByteOrderMark.НеИспользовать.
// Установка тела запроса без маркера BOM
Запрос.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
Разберем еще один критически важный момент — передачу заголовков HTTP. Сторонний сервер должен знать, в каком формате передаются данные в теле запроса. Если не передать заголовок Content-Type, сервер не сможет правильно распарсить входящий поток данных.
В зависимости от требований API стороннего сервиса используются разные типы содержимого:
application/json; charset=utf-8application/x-www-form-urlencodedЗаголовки добавляются в объект HTTPЗапрос с помощью свойства Заголовки:
Запрос.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Соберем все исправления в один рабочий пример кода, демонстрирующий корректное формирование и отправку POST-запроса авторизации:
// 1. Создаем структуру с данными авторизации
ДанныеАвторизации = Новый Структура;
ДанныеАвторизации.Вставить("phone", "0952000200");
ДанныеАвторизации.Вставить("password", "RMZ1CHbFeN");
// 2. Сериализуем данные в JSON-строку с помощью ЗаписьJSON
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ДанныеАвторизации);
СтрокаJSON = ЗаписьJSON.Закрыть();
// 3. Настраиваем HTTP-соединение и запрос
Соединение = Новый HTTPСоединение("www.example.com", 80, , , , 30);
Запрос = Новый HTTPЗапрос("/api/workstation/clients/login");
// 4. Устанавливаем заголовки
Запрос.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
// 5. Записываем тело запроса без BOM
Запрос.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
// 6. Выполняем POST-запрос и получаем ответ
Ответ = Соединение.ВызватьHTTPМетод("POST", Запрос);
Если Ответ.КодСостояния = 200 Тогда
Сообщить("Авторизация успешно пройдена!");
Иначе
Сообщить("Ошибка авторизации. Код состояния: " + Ответ.КодСостояния);
Сообщить("Текст ответа: " + Ответ.ПолучитьТелоКакСтроку());
КонецЕсли;
Соблюдение правил работы с HTTP-методами, правильная установка заголовков и явное отключение BOM-символа позволяют избежать большинства ошибок при интеграции 1С с внешними веб-сервисами.