При интеграции 1С со сторонними веб-сервисами и сайтами разработчики часто сталкиваются с задачей взаимодействия через REST API. Классический сценарий работы с защищенным API состоит из двух ключевых этапов: сначала выполняется запрос на аутентификацию для получения временного ключа доступа (токена), а затем выполняется рабочий запрос за данными с передачей этого токена в HTTP-заголовках. Разберем по шагам, как правильно реализовать этот процесс в 1С:Предприятии 8.3.
Рассмотрим общую схему взаимодействия с веб-сервисом:
/api/v1/login).accessToken.Authorization: Bearer <Токен>.Проанализируем создание объекта HTTPСоединение. В современных веб-сервисах практически всегда используется защищенный протокол HTTPS. Для корректной работы важно передавать имя сервера без префиксов протокола (https://) и завершающих слэшей, а для шифрования указывать порт 443 и защищенное соединение OpenSSL.
Посмотрим на пример инициализации подключения:
ИмяСервера = "devis7sur7.com";
Таймаут = 30;
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
Соединение = Новый HTTPСоединение(
ИмяСервера,
443,
,,,
Таймаут,
ЗащищенноеСоединение
);
Выясним, как передать учетные данные и получить ответ сервера. В зависимости от реализации API логин и пароль могут передаваться как в пути URL, так и в теле POST-запроса. Если параметры передаются в строке запроса, спецсимволы и пробелы следует предварительно экранировать с помощью функции КодироватьСтроку со способом кодирования СпособКодированияСтроки.КодировкаURL.
Рассмотрим пример отправки запроса на получение токена и обработку JSON-ответа:
Логин = "1c@devis7sur7.com";
Пароль = "SecretPassword123";
// Кодируем параметры для безопасной передачи в URL
ЛогинКодированный = КодироватьСтроку(Логин, СпособКодированияСтроки.КодировкаURL);
ПарольКодированный = КодироватьСтроку(Пароль, СпособКодированияСтроки.КодировкаURL);
АдресРесурсаАвторизации = "/api/v1/default/login/" + ЛогинКодированный + "/" + ПарольКодированный;
Заголовки = Новый Соответствие;
Заголовки.Вставить("Accept", "application/json");
HTTPЗапрос = Новый HTTPЗапрос(АдресРесурсаАвторизации, Заголовки);
Попытка
HTTPОтвет = Соединение.Получить(HTTPЗапрос);
Исключение
ВызватьИсключение "Ошибка сетевого взаимодействия: " + ОписаниеОшибки();
КонецПопытки;
Если HTTPОтвет.КодСостояния <> 200 Тогда
ВызватьИсключение "Ошибка авторизации. Код состояния: " + HTTPОтвет.КодСостояния;
КонецЕсли;
СтрокаJSON = HTTPОтвет.ПолучитьТелоКакСтроку();
// Извлекаем токен с помощью встроенных средств JSON
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(СтрокаJSON);
СтруктураОтвета = ПрочитатьJSON(Чтение);
Чтение.Закрыть();
ТокенДоступа = СтруктураОтвета.accessToken;
Если сервер возвращает данные в формате XML, разбор тела выполняется с помощью объекта ЧтениеXML или ПостроительDOM.
Теперь, имея полученный accessToken, мы можем обращаться к закрытым ресурсам API. Для этого в заголовки запроса добавляется заголовок Authorization со значением "Bearer " + ТокенДоступа.
Разберем пример запроса рабочей информации:
АдресДанных = "/api/v1/form/1";
ЗаголовкиДанных = Новый Соответствие;
ЗаголовкиДанных.Вставить("Authorization", "Bearer " + ТокенДоступа);
ЗаголовкиДанных.Вставить("Accept", "application/json");
HTTPЗапросДанных = Новый HTTPЗапрос(АдресДанных, ЗаголовкиДанных);
Попытка
HTTPОтветДанных = Соединение.Получить(HTTPЗапросДанных);
Исключение
ВызватьИсключение "Ошибка при получении данных: " + ОписаниеОшибки();
КонецПопытки;
Если HTTPОтветДанных.КодСостояния = 200 Тогда
ТелоОтвета = HTTPОтветДанных.ПолучитьТелоКакСтроку();
// Обработка полученных данных
ИначеЕсли HTTPОтветДанных.КодСостояния = 401 Тогда
ВызватьИсключение "Ошибка 401: Токен недействителен или срок его действия истек.";
ИначеЕсли HTTPОтветДанных.КодСостояния = 403 Тогда
ВызватьИсключение "Ошибка 403: Доступ запрещен для текущей учетной записи.";
ИначеЕсли HTTPОтветДанных.КодСостояния = 404 Тогда
ВызватьИсключение "Ошибка 404: Запрашиваемый ресурс не найден.";
Иначе
ВызватьИсключение "Ошибка сервера. Код: " + HTTPОтветДанных.КодСостояния;
КонецЕсли;
Рассмотрим важные практические нюансы, которые необходимо учитывать при промышленной эксплуатации интеграции:
401 (Unauthorized).КодСостояния перед чтением тела ответа, чтобы избежать ошибок парсинга некорректных ответов (например, HTML-страниц с ошибками веб-сервера 404 или 500).Получить(), ОтправитьДляОбработки() и других сетевых операций обязательно заключайте в конструкцию Попытка ... Исключение для перехвата сетевых сбоев, таймаутов и проблем с DNS.