С 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/
Оставьте комментарий