Изменения в 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

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.

Я, правда, пробовал еще решение от koder.by, но оно оказалось для сжатия deflate, а не gzip.

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

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

Среда: БП 3.0 Объем: 1.5 час

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

комментариев 9

  1. bob32:

    Если изначально заложить обработку media type , то проблем бы не было. Gzip и прочие варианты энкодинга часто используются. Игнор этих хедеров в запросе и привел к «внезапной» проблеме

    • напомнило анекдот:
      — а что, если ты потеряешь билет
      — а на этот случай у меня проездной.

      Ваше отношение попахивает паранойей.

      • bob32:

        Просто большой опыт разработки и оценка вариантов использования. Это уже на автомате делается

        • ну вы же понимаете, что советы водителя Белаза мало пригодятся рабочему лопатой.
          я пишу под бюджет клиента и не буду закладывать гипотетические вероятности.
          тем более что всякие API не так часто щупаю.

  2. Nap:

    Здравствуйте
    Может можете поделиться кодом функции РасшифроватьGZIP() или всей обработкой с инфостарта? К сожалению, не удается скачать обработку с инфостарта, а очень нужно, т.к. перестала работать загрузка с мой склада ((
    Заранее благодарю

  3. Кирилл:

    Капец, спасибо.
    Главное запрос на авторизацию возвращает нормальные данные, а уже следующие запросы отдают кракозябры. Полдня не мог понять, в чём дело, хотя тот же reqbin по тому же запросу получает нормальные данные. Почитал Ваш пост, сделал декодирование из gzip и всё заработало.

    • ну я понял по сообщениям в заголовках и тексту ответа в свое время, потом уже полез на сайт и прочитал про изменения в API.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *