При интеграции 1С с современными веб-сервисами программисты часто сталкиваются с документацией API, где примеры запросов приведены в формате консольной утилиты curl. Одной из самых распространенных задач является получение токена доступа по протоколу OAuth 2.0. В этой статье мы подробно разберем, как транслировать параметры команды curl в программный код 1С, используя встроенные механизмы работы с HTTP-запросами.
Рассмотрим типовой пример команды для получения токена:
curl -xpost -u "ИД_интеграции:СекретИнтеграции" -d "grant_type=client_credentials&scope=admin" https://api.service.net/oauth/token
Разберем, что означает каждый флаг, чтобы понимать, какие объекты 1С нам понадобятся:
curl отправляет заголовок Content-Type: application/x-www-form-urlencoded.Первым делом нам необходимо инициализировать объект HTTPСоединение. Важно помнить, что в качестве адреса сервера указывается только доменное имя без префикса https://. Также, если сервис работает через защищенный протокол, необходимо использовать объект ЗащищенноеСоединениеOpenSSL.
Проанализируем пример кода для создания соединения:
Сервер = "api.service.net"; // Только домен, без https://
Порт = 443;
Логин = "Ваш_ИД_Интеграции";
Пароль = "Ваш_Секрет_Интеграции";
Защита = Новый ЗащищенноеСоединениеOpenSSL();
Соединение = Новый HTTPСоединение(Сервер, Порт, Логин, Пароль, , , Защита);
Важное примечание: Передача логина и пароля в конструктор HTTPСоединение автоматически формирует заголовок Authorization: Basic.... Однако некоторые строгие API требуют ручного формирования этого заголовка. В таком случае данные кодируются в Base64 и добавляются в объект запроса.
Теперь подготовим сам запрос. Нам нужно указать относительный путь к ресурсу (endpoint), установить правильный заголовок содержимого и наполнить тело запроса параметрами.
Рассмотрим, как это реализовать пошагово:
HTTPЗапрос, указывая путь к методу (например, "/oauth/token").Content-Type. Для OAuth-авторизации это почти всегда application/x-www-form-urlencoded.Посмотрим на реализацию в коде:
ПутьКРесурсу = "/oauth/token";
Запрос = Новый HTTPЗапрос(ПутьКРесурсу);
// Устанавливаем заголовок, чтобы сервер понял формат передаваемых данных
Запрос.Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded");
// Формируем строку параметров (как в curl после флага -d)
СтрокаПараметров = "grant_type=client_credentials&scope=admin";
Запрос.УстановитьТелоИзСтроки(СтрокаПараметров, КодировкаТекста.UTF8);
После подготовки всех объектов вызываем метод POST. Крайне важно проанализировать ответ сервера, так как даже при технически успешном соединении сервер может вернуть ошибку авторизации или неверный формат данных.
Разберем процесс выполнения и проверки кода состояния:
Попытка
Ответ = Соединение.ВызватьHTTPМетод("POST", Запрос);
КодСостояния = Ответ.КодСостояния;
ТелоОтвета = Ответ.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
Если КодСостояния = 200 Тогда
// Успех, разбираем ответ (обычно JSON)
Сообщить("Токен получен успешно!");
Иначе
Сообщить("Ошибка при получении токена. Код: " + КодСостояния);
Сообщить("Текст ошибки: " + ТелоОтвета);
КонецЕсли;
Исключение
Сообщить("Произошла сетевая ошибка: " + ОписаниеОшибки());
КонецПопытки;
Как правило, в ответ на запрос авторизации приходит строка в формате JSON, содержащая поле access_token. Для работы с этими данными в 1С используем встроенные средства сериализации.
Проанализируем ситуацию извлечения токена:
ЧтениеJSON = Новый ЧтениеJSON();
ЧтениеJSON.УстановитьСтроку(ТелоОтвета);
ДанныеJSON = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
Если ДанныеJSON.Свойство("access_token") Тогда
ТокенДоступа = ДанныеJSON.access_token;
// Теперь этот токен можно использовать в заголовках последующих запросов
// Запрос.Заголовки.Вставить("Authorization", "Bearer " + ТокенДоступа);
КонецЕсли;
Чтобы ваш код работал стабильно в различных условиях, выясним причины возможных сбоев и способы их устранения:
HTTPСоединение всегда указывайте время ожидания (параметр Таймаут). Для веб-сервисов оптимально устанавливать от 30 до 60 секунд.ИнтернетПрокси и передайте его в конструктор соединения.TLS 1.2 или выше. Если вы используете старую версию платформы или ОС, 1С может выдать ошибку защищенного соединения. Убедитесь, что ваша система поддерживает актуальные версии криптографии.&, = или пробелы, их необходимо экранировать. Используйте функцию КодироватьСтроку(Значение, СпособКодированияСтроки.URLУмеренный) перед сборкой финальной строки тела запроса.В редких случаях, когда API использует специфические настройки (например, передачу клиентских сертификатов сложной структуры или редкие флаги прокси), проще выполнить команду через саму утилиту curl.exe, если она установлена в системе.
Выполним это с помощью метода ЗапуститьПриложение:
ПутьКФайлуРезультата = "C:\temp\answer.json";
КомандаЗапуска = "curl -xpost -u ""ID:Secret"" -d ""grant_type=client_credentials"" -o """ + ПутьКФайлуРезультата + """ https://api.service.net/oauth/token";
ЗапуститьПриложение(КомандаЗапуска, , Истина); // Истина — ждать завершения
// После выполнения читаем файл
ТекстОтвета = Новый ТекстовыйДокумент();
ТекстОтвета.Прочитать(ПутьКФайлуРезультата);
Результат = ТекстОтвета.ПолучитьТекст();
Однако штатный метод через HTTPСоединение является более предпочтительным, так как он платформонезависим и работает быстрее за счет отсутствия обращения к файловой системе и внешним процессам.