Как правильно выполнить POST-запрос к API Леруа Мерлен из 1С:Предприятие?

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

При интеграции с внешними веб-сервисами, такими как API маркетплейса Леруа Мерлен, разработчики 1С часто сталкиваются с ошибками авторизации, даже если параметры запроса кажутся идентичными примерам из документации. Одной из наиболее частых причин возникновения ошибки 401 (Unauthorized) является некорректная передача параметров в теле HTTPЗапрос при использовании типа содержимого application/x-www-form-urlencoded. Давайте подробно разберем, как избежать подобных проблем.

Основные причины возникновения ошибки 401

Если сервер возвращает ошибку 401, это означает, что переданные учетные данные не прошли проверку. Чаще всего проблема кроется не в самой логике платформы 1С, а в том, как именно сформирована строка параметров. Рассмотрим ключевые факторы:

  1. Экранирование спецсимволов: Если в ваших логине, пароле или секретном ключе присутствуют символы, которые являются зарезервированными для URL (например, &, +, @), сервер будет воспринимать их как разделители параметров. Это приводит к искажению данных, которые получает API.
  2. Неверные учетные данные: Убедитесь, что полученные от службы поддержки данные (client_secret, пароль) не содержат скрытых символов, таких как неразрывные пробелы, которые могут случайно попасть в строку при копировании из почты или документа.
  3. Особенности кодировки: При формировании тела запроса важно правильно задать кодировку текста (UTF-8), чтобы сервер корректно интерпретировал передаваемые символы.

Шаг 1: Правильное кодирование параметров запроса

Когда вы формируете тело запроса для метода application/x-www-form-urlencoded, каждый параметр (ключ и значение) должен быть закодирован. В 1С для этих целей предназначен метод КодировкаСтроки. Если вы используете современную версию платформы, примените его для каждой переменной, содержащей потенциально опасные символы.

Рассмотрим пример правильного формирования тела запроса:


// Предположим, у нас есть переменные:
// username, password, client_id, client_secret

КодированныйПароль = КодировкаСтроки(password, КодировкаСтроки.КодироватьВСтрокуURL);
КодированныйЛогин = КодировкаСтроки(username, КодировкаСтроки.КодироватьВСтрокуURL);

ТелоЗапроса = "grant_type=password" + 
              "&username=" + КодированныйЛогин + 
              "&password=" + КодированныйПароль + 
              "&client_id=" + client_id + 
              "&client_secret=" + client_secret;

Использование этого подхода гарантирует, что символ &, содержащийся, например, в пароле, превратится в %26, и сервер Леруа Мерлен воспримет его как часть пароля, а не как начало нового параметра.

Шаг 2: Отладка запроса с помощью инструментов анализа

Если вы не уверены в правильности формирования запроса, крайне рекомендуется воспользоваться инструментами отладки. Даже если установка стороннего ПО на рабочем месте ограничена, вы можете использовать следующие методы:

Шаг 3: Практический пример кода для обращения к API

Давайте соберем все воедино и посмотрим на рабочий пример функции для получения токена:


Функция ПолучитьТокенДоступа(АПИ_Кей, username, password, client_id, client_secret)
    
    Соединение = Новый HTTPСоединение("api.leroymerlin.ru", 443, , , , , Новый ЗащищенноеСоединениеOpenSSL());
    Запрос = Новый HTTPЗапрос("/marketplace/oauth/token");
    
    Запрос.Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded");
    Запрос.Заголовки.Вставить("x-api-key", АПИ_Кей);
    
    // Формируем тело с учетом кодирования спецсимволов
    СтрокаПараметров = СтрШаблон("grant_type=password&username=%1&password=%2&client_id=%3&client_secret=%4", 
                        КодировкаСтроки(username, КодировкаСтроки.КодироватьВСтрокуURL),
                        КодировкаСтроки(password, КодировкаСтроки.КодироватьВСтрокуURL),
                        client_id, 
                        client_secret);
    
    Запрос.УстановитьТелоИзСтроки(СтрокаПараметров, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
    
    Ответ = Соединение.ВызватьHTTPМетод("POST", Запрос);
    
    Если Ответ.КодСостояния = 200 Тогда
        Возврат ПрочитатьJSON(Ответ.ПолучитьТелоКакСтроку()); // Обработка успешного ответа
    Иначе
        ЗаписьЖурналаРегистрации("API Леруа", УровеньЖурналаРегистрации.Ошибка, , , Ответ.ПолучитьТелоКакСтроку());
        Возврат Неопределено;
    КонецЕсли;
    
КонецФункции

Заключение

Работа с внешними API требует внимательности к деталям формирования HTTP-запросов. Помните, что экранирование спецсимволов — это стандарт индустрии, который позволяет избежать множества ошибок на этапе авторизации. Всегда храните свои учетные данные в защищенных местах (константы, параметры сеанса) и ведите логирование ответов сервера для быстрой диагностики проблем.

← На главную