Изменения в API Мой Склад в 2024

С 1 декабря 2023 мой склад внес изменения в API.

Адрес API поменялся с online.moysklad.ru на api.moysklad.ru.

Кроме этого, нужно добавить во все запросы заголовок Accept-Encoding:gzip пример:

	Запрос = Новый HTTPЗапрос(СтрокаЗапроса);
	Запрос.Заголовки.Вставить("Authorization", "Bearer " +  access_token); //Authorization со значением Bearer 
	//Добавлено с 1 декабря 2023 из-за изменений в API https://dev.moysklad.ru/doc/api/remap/1.2/#mojsklad-json-api
	Запрос.Заголовки.Вставить("Accept-Encoding", "gzip");  
	РезультатЗапроса = Соединение.Получить(Запрос);

Но этого мало, возникала ошибка:Ошибка получения данных из Мой склад: Не получилось авторизоваться. Код состояния: 415. Ответ:

415 Unsupported Media Type


nginx/1.22.0

Что это за ошибка, сказано здесь:

Сжатие содержимого ответов

Сервер апи использует сжатие содержимого ответов, поэтому при обращении к эндпоинтам апи через HTTP-заголовок запроса Accept-Encoding следует указать кодировку сжатия содержимого ответов. В редких случаях сервер может не применять сжатие ответа. При использовании сжатия, сервер апи укажет это в заголовке Content-Encoding с используемой кодировкой. Сервер апи поддерживает только кодировку gzip. Запросы без этого заголовка, а также запросы с заголовком, но иной кодировкой сжатия не будут обработаны. Сервер ответит с кодом 415 без тела ответа.

Пришлось искать как распаковывать двоичные данные из GZIP.

Решение нашлось в статье Чтение сжатого gzip, deflate HTTP ответа сервера. Без ВК. Уменьши время загрузки и сократи трафик в 3 раза на Инфостарте.

Пришлось получать тело результата запроса не как строку, а как двоичные данные и уже их перекодировать из gzip в строку:

	//Ответ = РезультатЗапроса.ПолучитьТелоКакСтроку();
	ДД = РезультатЗапроса.ПолучитьТелоКакДвоичныеДанные();
	Ответ = РасшифроватьGZIP(ДД);

В функцию из статьи внес поправку, явно указал кодировку UTF-8, без этого выдавало нечитаемые строки:

	//Чтение текста
	ЧтениеТекста=Новый ЧтениеТекста(КаталогВременныхФайлов+РазделительПутей+"body.json", "UTF-8");
	Текст=ЧтениеТекста.Прочитать();
	ЧтениеТекста.Закрыть();
	УдалитьФайлы(КаталогВременныхФайлов);
	Возврат Текст;	

И еще, важно, что первый запрос security/token возвращает строку, а не сжатый gzip. По идее, в заголовках ответа можно понять формат ответа, но у меня не было отладчика под рукой, поэтому просто прописал вызовы декомпрессии в тех запросах, которые возвращают gzip.

Моё решение:

      Если Результат.Заголовки.Получить("Content-Encoding") = "gzip" Тогда
            ДД = Результат.ПолучитьТелоКакДвоичныеДанные();
            СтрокаРезультата = РасшифроватьGZIP(ДД); 
        Иначе
            СтрокаРезультата = Результат.ПолучитьТелоКакСтроку("utf-8"); 
        КонецЕсли;

Получается, что moysklad начал экономить трафик. Мелочь, а полезно…

И да, изменения настигли клиента внезапно. Пришлось оперативно «чинить» интеграцию.

Источник: https://geniy1s.ru/izmeneniya-v-api-moj-sklad-v-2024/


Комментарии

Оставьте комментарий

Создайте подобный сайт на WordPress.com
Начало работы