При интеграции 1С с внешними API, такими как Wildberries, мы часто сталкиваемся с необходимостью отправлять HTTP-запросы для получения или отправки данных. Однако, иногда запрос, который успешно работает в браузере или специализированных инструментах вроде Postman, может возвращать ошибку в 1С. Одна из распространенных проблем — получение кода состояния 301 Moved Permanently.
В этой статье мы подробно рассмотрим, как правильно настроить HTTP-запрос в 1С для работы с API Wildberries, преодолеть ошибку 301, использовать защищенное соединение HTTPS и корректно передавать необходимые заголовки.
Ошибка 301 Moved Permanently означает, что запрашиваемый ресурс был окончательно перемещен на новый URL-адрес. Браузеры автоматически обрабатывают такие перенаправления: получив ответ 301, они извлекают новый URL из заголовка Location HTTP-ответа и немедленно отправляют запрос по новому адресу. В 1С стандартные объекты HTTPЗапрос и HTTPСоединение не всегда выполняют автоматическое перенаправление, поэтому мы должны обработать его самостоятельно, либо, как чаще бывает в современных API, убедиться, что мы изначально обращаемся к правильному адресу и используем корректный протокол.
Основной причиной ошибки 301 при работе с современными API, такими как Wildberries, из 1С часто является попытка установить соединение по протоколу HTTP (незащищенному), тогда как сервер ожидает HTTPS (защищенное соединение). Сервер, видя запрос по HTTP, может ответить 301, перенаправляя на тот же ресурс, но уже по HTTPS. Таким образом, первое, что мы должны проверить, это использование защищенного соединения.
Большинство современных API требуют использования защищенного протокола HTTPS для обеспечения безопасности передаваемых данных. Для работы с HTTPS в 1С нам необходимо использовать объект ЗащищенноеСоединениеOpenSSL. Этот объект позволяет установить зашифрованное соединение с сервером, используя протоколы SSL/TLS.
Создание объекта защищенного соединения:
Начнем с создания экземпляра ЗащищенноеСоединениеOpenSSL. Для большинства стандартных запросов к общедоступным API, нам не потребуется указывать клиентские сертификаты, если API не требует двухсторонней аутентификации.
SSL_Соединение = Новый ЗащищенноеСоединениеOpenSSL;
Использование защищенного соединения при создании HTTP-соединения:
Затем, при создании объекта HTTPСоединение, мы должны передать наш объект SSL_Соединение в качестве последнего параметра. Также важно указать стандартный порт для HTTPS, который равен 443.
Рассмотрим синтаксис конструктора HTTPСоединение:
HTTPСоединение = Новый HTTPСоединение(
"suppliers-api.wildberries.ru", // Хост (домен сервера)
443, // Порт (для HTTPS всегда 443)
,,, // Прочие необязательные параметры, которые мы можем пропустить
SSL_Соединение // Объект защищенного соединения
);
Обратите внимание, что мы пропустили несколько необязательных параметров (пользователь, пароль, прокси и т.д.), просто поставив запятые. Важно передать SSL_Соединение на шестой позиции.
HTTP-заголовки играют критическую роль в правильном взаимодействии с API. Они предоставляют дополнительную информацию о запросе или ответе. Для API Wildberries, как и для многих других, нам понадобятся как минимум заголовки для авторизации и указания типа контента.
Заголовок Authorization:
Этот заголовок используется для аутентификации пользователя или приложения. В случае с API Wildberries, как правило, используется Bearer Token. Ваш ключ API (токен) должен быть передан в этом заголовке. Если API ключ находится в параметрах URL, заголовок авторизации может быть не нужен. Однако, в примере кода, который мы рассмотрим, он используется.
Заголовки = Новый Соответствие;
Заголовки.Вставить("Authorization", "Bearer " + Токен); // Предполагается, что 'Токен' - это ваша переменная с ключом API
Важно помнить, что токен может иметь ограниченный срок действия (например, 180 дней для Wildberries) и требовать обновления.
Заголовок Content-Type:
Этот заголовок указывает серверу тип данных, которые отправляются в теле запроса. Для JSON-данных это обычно application/json. Даже если мы не отправляем тело запроса (например, для GET-запроса), этот заголовок иногда требуется API для корректной работы.
Заголовки.Вставить("Content-Type", "application/json");
Заголовок Accept (необязательно, но полезно):
Этот заголовок сообщает серверу, какой формат данных клиент ожидает получить в ответе. Если API может отдавать данные в разных форматах (например, JSON, XML), указание Accept: application/json гарантирует, что мы получим JSON.
Заголовки.Вставить("Accept", "application/json"); // Можно добавить для явного указания желаемого формата ответа
Теперь, когда мы разобрали основные компоненты, давайте соберем все вместе в рабочий пример кода, основанный на решении, которое было предоставлено в обсуждении.
Подготовка заголовков и SSL-соединения:
В первую очередь, мы создаем объект Соответствие для хранения наших HTTP-заголовков и инициализируем защищенное SSL-соединение.
// Предполагается, что переменная 'Токен' содержит ваш действительный ключ API Wildberries
Токен = "ВАШ_КЛЮЧ_API_WILDBERRIES";
Заголовки = Новый Соответствие;
Заголовки.Вставить("Authorization", "Bearer " + Токен);
Заголовки.Вставить("Content-Type", "application/json");
// Заголовки.Вставить("Accept", "application/json"); // Дополнительный, но рекомендуемый заголовок
SSL_Соединение = Новый ЗащищенноеСоединениеOpenSSL;
Создание HTTP-соединения:
Мы создаем объект HTTPСоединение, указывая хост API Wildberries, порт 443 для HTTPS и наше защищенное SSL-соединение.
// Используем домен API Wildberries для поставщиков.
// Обратите внимание: домен может отличаться в зависимости от версии API (v1, v2) и типа запроса.
// suppliers-api.wildberries.ru или suppliers-stats.wildberries.ru
HttpСоединение = Новый HttpСоединение("suppliers-api.wildberries.ru", 443, , , , , SSL_Соединение);
Формирование URL запроса:
URL запроса включает путь к сервису API и параметры. Параметры часто содержат даты и другие фильтры. Wildberries API обычно требует даты в формате ISO 8601 (например, yyyy-MM-ddTHH:mm:ss.sssZ).
// Формируем даты для запроса. Например, данные за последние 3 дня и на 5 дней вперед.
// Обратите внимание на формат: "yyyy-MM-ddT00:00:00.000Z"
date_start = Формат(ТекущаяДата() - 3 * 86400, "ДФ=yyyy-MM-dd") + "T00:00:00.000Z";
date_end = Формат(ТекущаяДата() + 5 * 86400, "ДФ=yyyy-MM-dd") + "T23:59:59.000Z";
// Составляем полный путь сервиса с параметрами
// Пример запроса к API v2 для получения заказов.
// Параметры 'take' и 'skip' используются для пагинации.
Сервис = "/api/v2/orders?"
+ "date_start=" + date_start
+ "&date_end=" + date_end
+ "&take=500"
+ "&skip=0";
Здесь ТекущаяДата() - 3 * 86400 вычисляет дату за 3 дня до текущей. 86400 — это количество секунд в сутках.
Создание HTTP-запроса и его выполнение:
Мы создаем объект HTTPЗапрос, передавая путь к сервису и подготовленные заголовки. Затем выполняем запрос с помощью метода Получить объекта HTTPСоединение.
HTTPЗапрос = Новый HttpЗапрос(Сервис, Заголовки);
// Отправляем запрос и получаем ответ
HttpОтвет = HttpСоединение.Получить(HTTPЗапрос);
Обработка ответа:
После получения ответа, мы проверяем его статус и получаем тело ответа как строку. Если ответ в формате JSON, мы используем функции для парсинга JSON.
Если HttpОтвет.КодСостояния = 200 Тогда // Проверяем, что запрос успешно выполнен (код 200 OK)
Результат = HttpОтвет.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
// Предполагается, что 'мПрочитатьJSON' - это ваша вспомогательная функция для парсинга JSON.
// В 1С для этого можно использовать объекты ЧтениеJSON и ЗаписьJSON или JSON.Прочитать().
// Пример использования стандартных средств 1С:
// ЧтениеJSON = Новый ЧтениеJSON;
// ЧтениеJSON.УстановитьСтроку(Результат);
// ЗаказыWB = JSON.Прочитать(ЧтениеJSON);
// Используем функцию из примера:
ЗаказыWB = мПрочитатьJSON(Результат);
Сообщить("Данные успешно получены: " + Результат);
// Далее можно работать с ЗаказыWB как со Структурой или Массивом
Иначе
Сообщить("Ошибка выполнения запроса. Код состояния: " + HttpОтвет.КодСостояния);
Сообщить("Текст ошибки: " + HttpОтвет.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8));
КонецЕсли;
Даже с правильно настроенным HTTP-запросом, мы можем столкнуться со специфическими ошибками API. Рассмотрим некоторые из них, включая ту, что была упомянута в обсуждении.
301 Moved Permanently:
Причина: Чаще всего, попытка доступа к ресурсу по HTTP вместо HTTPS. Также может указывать на устаревший URL или изменение домена API.
Решение: Убедитесь, что используете HTTPS и порт 443 с ЗащищенноеСоединениеOpenSSL, а также актуальный домен API.
400 Bad Request:
Причина: Некорректный запрос, синтаксическая ошибка в JSON-теле, невалидные параметры запроса, или параметры не соответствуют ожидаемому формату.
Решение: Внимательно проверьте URL, формат и значения всех параметров, а также синтаксис JSON, если вы отправляете данные в теле запроса.
401 Unauthorized:
Причина: Проблема с токеном авторизации. Токен может отсутствовать, быть передан с ошибкой, истёк (срок действия токена Wildberries — 180 дней), быть повреждён или отозван.
Решение: Проверьте, что заголовок Authorization: Bearer ваш_токен передан корректно. Убедитесь, что токен не истёк и имеет правильный формат. При необходимости сгенерируйте новый токен в личном кабинете Wildberries.
403 Forbidden:
Причина: Токен валиден, но не имеет достаточных прав для выполнения конкретной операции или доступа к данному ресурсу.
Решение: Сверьте тип вашего токена и его права доступа с документацией метода API, который вы пытаетесь вызвать. Возможно, вам нужен токен другой категории или с более широкими разрешениями.
422 Ошибка обработки параметров:
Причина: Данные, переданные в запросе, противоречат друг другу или не могут быть обработаны сервером из-за логических несоответствий.
Решение: Проверьте логику передаваемых параметров, их взаимосвязь. Например, дата начала не может быть позже даты окончания.
429 Too Many Requests:
Причина: Вы превысили лимит запросов к API за определенный период времени (rate limiting).
Решение: Снизьте частоту отправки запросов. Используйте механизмы задержки между запросами или экспоненциальную выдержку при повторных попытках.
5XX Ошибка сервера (например, 500 Internal Server Error, 502 Bad Gateway):
Причина: Проблема на стороне сервера API. Сервис временно недоступен или возникла внутренняя ошибка.
Решение: Обычно это временные проблемы. Рекомендуется повторить запрос через некоторое время. Можно настроить несколько попыток с небольшими задержками.
Ошибка "Некорректный параметр skip":
Причина: Эта ошибка специфична для пагинации в API Wildberries. Она может возникать, если сумма значений параметров take (количество элементов на странице) и skip (количество пропускаемых элементов) превышает максимально допустимое значение, установленное для данного метода API (например, 10 000).
Решение: Пересмотрите логику пагинации. Если вам нужно получить большое количество данных, возможно, придется делать несколько запросов, сбрасывая skip после достижения лимита и используя другие параметры для смещения (например, next_token, если API поддерживает курсорную пагинацию, или изменяя диапазоны дат). Убедитесь, что skip + take не превышает 10000 для запросов, где это ограничение действует.
Для эффективной отладки и понимания работы HTTP-запросов рекомендуем использовать следующие инструменты и подходы:
Postman или аналогичные инструменты:
Перед тем как писать код в 1С, всегда полезно протестировать запрос во внешнем инструменте, таком как Postman. Это позволяет быстро проверить правильность URL, заголовков, параметров и тела запроса, а также увидеть полный ответ сервера и код состояния. Если запрос работает в Postman, но не в 1С, это указывает на проблему в реализации 1С.
Инструменты разработчика браузера (F12):
Если вы можете выполнить запрос через браузер (как в исходной задаче), используйте вкладку "Network" (Сеть) в инструментах разработчика (открываются по F12). Там вы увидите все отправленные запросы, их заголовки (Request Headers, Response Headers), тело запроса/ответа и коды состояния. Сравните эти данные с тем, что вы формируете в 1С.
Отладчик 1С:
Используйте встроенный отладчик 1С для пошагового выполнения кода. Это позволит проверить, какие значения принимают переменные, как формируется URL, какие заголовки добавляются в объект HTTPЗапрос, и что возвращает HttpОтвет до попытки получения тела как строки. Так вы сможете точно определить место возникновения ошибки.
Хотя стандартные средства 1С (HTTPЗапрос, HTTPСоединение, ЗащищенноеСоединениеOpenSSL) достаточно мощны, они требуют написания значительного объема кода для обработки общих задач, таких как перенаправления, управление cookies, сериализация/десериализация JSON, повторные попытки. Для упрощения работы с HTTP-запросами в 1С существуют внешние библиотеки, такие как КоннекторHTTP.
КоннекторHTTP — это популярная библиотека, которая позволяет выполнять запросы к HTTP/HTTPS-сервисам гораздо компактнее и удобнее. Она берет на себя множество рутинных операций:
Использование КоннекторHTTP может значительно сократить объем кода и повысить его читаемость, особенно при работе со сложными API или большом количестве различных запросов. Если вы часто взаимодействуете с внешними веб-сервисами, рассмотрите возможность применения этой или аналогичной библиотеки.
Мы выяснили, что основной причиной ошибки 301 при работе с API Wildberries из 1С является некорректная настройка протокола соединения и отсутствие необходимых заголовков. Путем использования ЗащищенноеСоединениеOpenSSL, указания порта 443 и правильной передачи заголовков Authorization и Content-Type, мы можем успешно выполнять запросы и получать данные.
Помните о важности отладки и тестирования запросов во внешних инструментах, а также о возможности использования сторонних библиотек, таких как КоннекторHTTP, для упрощения разработки и повышения надежности ваших интеграций с внешними сервисами.