Изменения в 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
Что это за ошибка, сказано здесь:
Сжатие содержимого ответов
Сервер апи использует сжатие содержимого ответов, поэтому при обращении к эндпоинтам апи через HTTP-заголовок запроса Accept-Encoding следует указать кодировку сжатия содержимого ответов. В редких случаях сервер может не применять сжатие ответа. При использовании сжатия, сервер апи укажет это в заголовке Content-Encoding с используемой кодировкой. Сервер апи поддерживает только кодировку gzip. Запросы без этого заголовка, а также запросы с заголовком, но иной кодировкой сжатия не будут обработаны. Сервер ответит с кодом 415 без тела ответа.
Пришлось искать как распаковывать двоичные данные из GZIP.
Решение нашлось в статье Чтение сжатого gzip, deflate HTTP ответа сервера. Без ВК. Уменьши время загрузки и сократи трафик в 3 раза на Инфостарте.
Пришлось получать тело результата запроса не как строку, а как двоичные данные и уже их перекодировать из gzip в строку:
//Ответ = РезультатЗапроса.ПолучитьТелоКакСтроку(); ДД = РезультатЗапроса.ПолучитьТелоКакДвоичныеДанные(); Ответ = РасшифроватьGZIP(ДД);
В функцию из статьи внес поправку, явно указал кодировку UTF-8, без этого выдавало нечитаемые строки:
//Чтение текста ЧтениеТекста=Новый ЧтениеТекста(КаталогВременныхФайлов+РазделительПутей+"body.json", "UTF-8"); Текст=ЧтениеТекста.Прочитать(); ЧтениеТекста.Закрыть(); УдалитьФайлы(КаталогВременныхФайлов); Возврат Текст;
И еще, важно, что первый запрос security/token возвращает строку, а не сжатый gzip. По идее, в заголовках ответа можно понять формат ответа, но у меня не было отладчика под рукой, поэтому просто прописал вызовы декомпрессии в тех запросах, которые возвращают gzip.
Я, правда, пробовал еще решение от koder.by, но оно оказалось для сжатия deflate, а не gzip.
Получается, что moysklad начал экономить трафик. Мелочь, а полезно…
И да, изменения настигли клиента внезапно. Пришлось оперативно «чинить» интеграцию.
Среда: БП 3.0 Объем: 1.5 час
Если изначально заложить обработку media type , то проблем бы не было. Gzip и прочие варианты энкодинга часто используются. Игнор этих хедеров в запросе и привел к «внезапной» проблеме
напомнило анекдот:
— а что, если ты потеряешь билет
— а на этот случай у меня проездной.
Ваше отношение попахивает паранойей.
Просто большой опыт разработки и оценка вариантов использования. Это уже на автомате делается
ну вы же понимаете, что советы водителя Белаза мало пригодятся рабочему лопатой.
я пишу под бюджет клиента и не буду закладывать гипотетические вероятности.
тем более что всякие API не так часто щупаю.
Здравствуйте
Может можете поделиться кодом функции РасшифроватьGZIP() или всей обработкой с инфостарта? К сожалению, не удается скачать обработку с инфостарта, а очень нужно, т.к. перестала работать загрузка с мой склада ((
Заранее благодарю
300 рублей. Реквизиты для оплаты на странице «Контакты».
Капец, спасибо.
Главное запрос на авторизацию возвращает нормальные данные, а уже следующие запросы отдают кракозябры. Полдня не мог понять, в чём дело, хотя тот же reqbin по тому же запросу получает нормальные данные. Почитал Ваш пост, сделал декодирование из gzip и всё заработало.
ну я понял по сообщениям в заголовках и тексту ответа в свое время, потом уже полез на сайт и прочитал про изменения в API.