Как исправить ошибки авторизации при отправке POST-запроса в 1С?

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

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

Ошибка 1. Использование метода GET вместо POST (Код состояния 404)

Проанализируем первую частую ошибку. Если сервер ожидает данные авторизации через HTTP-метод POST по конкретному URL, а клиент отправляет GET-запрос, веб-сервер может вернуть ошибку 404 страница не найдена, поскольку маршрут для обработки GET-запросов по данному адресу не зарегистрирован.

В коде 1С за отправку GET-запроса отвечает метод Получить() объекта HTTPСоединение. Если вызвать его с телом запроса, сервер либо проигнорирует тело, либо вернет ошибку адресации.

Для выполнения POST-запросов в 1С следует использовать специализированные методы:

  1. Метод ОтправитьДляОбработки() объекта HTTPСоединение.
  2. Универсальный метод ВызватьHTTPМетод("POST", Запрос), который считается более современным и стандартизированным подходом.

Посмотрим на пример правильного вызова отправки POST-запроса:


// Создаем соединение
Соединение = Новый HTTPСоединение("www.example.com", 80, , , , 30);

// Подготавливаем запрос
АдресURL = "/api/workstation/clients/login";
Запрос = Новый HTTPЗапрос(АдресURL);

// Отправляем POST-запрос
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
// Или с помощью универсального метода:
// Ответ = Соединение.ВызватьHTTPМетод("POST", Запрос);

Ошибка 2. Наличие символа BOM в начале JSON-строки (unexpected token)

Выясним причину следующей распространенной проблемы. Даже после переключения на метод POST сервер может вернуть ошибку синтаксического анализа JSON с сообщением вида unexpected token at '?...'.

Символ ? (или служебный символ \uFEFF) в начале строки появляется из-за того, что платформа 1С по умолчанию добавляет маркер последовательности байтов (Byte Order Mark, BOM) при кодировании текста в UTF-8. Многие REST API не умеют обрабатывать BOM и воспринимают его как невалидный символ перед открывающей скобкой JSON.

Чтобы исключить попадание маркера BOM в запрос, при вызове метода УстановитьТелоИзСтроки() необходимо явно указывать третий параметр ИспользованиеByteOrderMark.НеИспользовать.


// Установка тела запроса без маркера BOM
Запрос.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);

Ошибка 3. Отсутствие или неверное значение заголовка Content-Type

Разберем еще один критически важный момент — передачу заголовков HTTP. Сторонний сервер должен знать, в каком формате передаются данные в теле запроса. Если не передать заголовок Content-Type, сервер не сможет правильно распарсить входящий поток данных.

В зависимости от требований API стороннего сервиса используются разные типы содержимого:

  1. Для передачи структуры JSON: application/json; charset=utf-8
  2. Для передачи параметров формы: application/x-www-form-urlencoded

Заголовки добавляются в объект HTTPЗапрос с помощью свойства Заголовки:

Запрос.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");

Итоговый корректный пример авторизации по HTTP POST

Соберем все исправления в один рабочий пример кода, демонстрирующий корректное формирование и отправку 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С с внешними веб-сервисами.

← На главную