Интеграция 1С с маркетплейсами и внешними веб-сервисами — одна из наиболее частых задач разработчика. При обращении к API Яндекс.Маркета через платформенные объекты 1С часто возникают ошибки, связанные с неправильным разделением адреса сервера и относительного пути ресурса, а также с настройками безопасности протокола HTTPS.
Разберем по шагам, почему возникает ошибка при отправке запроса, как правильно структурировать обращение и какие современные механизмы платформы 1С:Предприятие 8.3 следует применять для надежного обмена данными.
Проанализируем ситуацию, с которой столкнулся разработчик в исходном примере. При первой попытке код выглядел следующим образом:
Запрос = "http:/api.content.market.yandex.ru/v1/model/12859245/info.xml?geo_id=213&fields=ALL&api_key=";
HTTP = Новый HTTPСоединение("market.yandex.ru");
vФайлОбмена = "d:\ЗапросПоиска.xml";
HTTP.Получить(Запрос, vФайлОбмена);
Выясним причину падения данного кода с ошибкой:
HTTPСоединение был указан хост "market.yandex.ru", тогда как API находится на поддомене "api.content.market.yandex.ru".Получить() был передан полный URL вместе с протоколом и доменом (http:/api.content.market.yandex.ru/...), тогда как этот метод ожидает исключительно относительный URI ресурса вместе с GET-параметрами.Исправленный базовый вариант вызова выглядит так:
Запрос = "/v1/model/12859245/info.xml?geo_id=213&fields=ALL&api_key=" + КлючAPI;
HTTP = Новый HTTPСоединение("api.content.market.yandex.ru");
vФайлОбмена = "d:\ЗапросПоиска.xml";
HTTP.Получить(Запрос, vФайлОбмена);
Рассмотрим более надежный и современный способ работы с веб-сервисами в платформе 1С:Предприятие 8.3. В реальных условиях внешние API работают исключительно по защищенному протоколу HTTPS (порт 443), а сохранение промежуточных файлов на диск замедляет работу и часто недоступно на сервере.
Посмотрим на пример отправки запроса с получением ответа напрямую в оперативную память через объекты HTTPЗапрос и HTTPОтвет:
// 1. Инициализируем защищенное соединение
SSL = Новый ЗащищенноеСоединениеOpenSSL();
HTTP = Новый HTTPСоединение("api.content.market.yandex.ru", 443, , , , 30, SSL);
// 2. Формируем заголовки и относительный путь
Заголовки = Новый Соответствие();
Заголовки.Вставить("Accept", "application/json");
Заголовки.Вставить("Authorization", "OAuth oauth_token=" + ТокенАвторизации + ", oauth_client_id=" + ИдентификаторКлиента);
АдресРесурса = "/v1/model/12859245/info.json?geo_id=213&fields=ALL";
Запрос = Новый HTTPЗапрос(АдресРесурса, Заголовки);
// 3. Отправляем запрос и обрабатываем результат
Ответ = HTTP.Получить(Запрос);
Если Ответ.КодСостояния = 200 Тогда
СтрокаОтвета = Ответ.ПолучитьТелоКакСтроку();
Чтение = Новый ЧтениеJSON();
Чтение.УстановитьСтроку(СтрокаОтвета);
ДанныеОтвета = ПрочитатьJSON(Чтение);
Чтение.Закрыть();
// Работаем со структурой данных
// Например: Модель = ДанныеОтвета.model;
Иначе
ВызватьИсключение "Ошибка сервиса. Код: " + Ответ.КодСостояния + ", Ответ: " + Ответ.ПолучитьТелоКакСтроку();
КонецЕсли;
Разберем важные нюансы, которые необходимо учитывать при разработке интеграции с API Яндекс.Маркета:
ЧтениеJSON и ПрочитатьJSON() без необходимости разбора структуры тегов или записи на диск.Authorization).КодироватьСтроку(Значение, СпособКодированияСтроки.КодировкаURL).429 (Too Many Requests) или ошибок 5xx следует предусмотреть повторную отправку запроса с небольшой паузой.