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

0. Malfarion 200 08.06.18 03:48 Сейчас в теме
В платформе 1С:Предприятие не реализовано штатного механизма декодирования ответа веб серверов, в которых присутствует gzip сжатие.
Некоторые использовали WinHttpRequest.5.1 , кто-то писал ВК.
Друзья, хватит. Вот вам решение.

Перейти к публикации

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. PerlAmutor 107 08.06.18 11:57 Сейчас в теме
(0)
Будет работать на платформе 8.3.9 + . Потому что работа с двоичными данными появилась только в них.

Тема актуальная, т.к. сайт РБК "любит" отдавать курсы валют в Gzip формате, если запрашивать периодом. Никакие переданные ему ключи в заголовках на его поведение не влияют.

К сожалению у меня платформа 8.3.7. Каким-то образом в ней можно извернуться так, чтобы добавить к данным заголовок (может через прямое редактирование base64 строки)?
---
Кажется нашел как можно сделать на старых платформах, благодаря Александру Шпагину, но это работает только с deflate, а по поводу Gzip вопрос остается открытым:

// сжатие решается конструкцией: 
    
    ХЗ = Новый ХранилищеЗначения(НашеЗначениеКотороеНадоСжать, СжатиеДанных(9));
    СтрокаBase64 = СериализаторXDTO.XMLСтрока(ХЗ);
    СжатыеДвоичныеДанные = Base64Значение(СтрокаBase64);


// распаковка: 
    СтрокаBase64 = Base64Строка(СжатыеДвоичныеДанные);
    ХЗ = СериализаторXDTO.XMLЗначение(Тип("ХранилищеЗначения"), СтрокаBase64);
    НашеЗначение = ХЗ.Получить();

Показать
DrAku1a; Поручик; gradi; +3 Ответить
2. Malfarion 200 08.06.18 12:36 Сейчас в теме
(1) Говорят что формат deflate не используется сейчас веб серверами, хотя deflate = gzip без заголовков (чисто сжатые данные), для стандартизации все перешли на gzip.
3. PerlAmutor 107 08.06.18 16:20 Сейчас в теме
(1) К сожалению вариант с ХранилищемЗначения не работает, если на вход поступает Base64 строка с чистыми Deflate данными...
4. oyti 55 08.06.18 17:15 Сейчас в теме
Как раз совсем недавно бился над данным вопросом и временно перешел на обмен без сжатия (что так себе вариант).
Спасибо. Будем тестировать...
5. PerlAmutor 107 09.06.18 12:11 Сейчас в теме
Кстати насчет обновления курсов валют с сайта РБК. Один и тот же запрос валюты может возвращать 10 раз несжатый траффик, а потом ему что-то в голову бьет и начинает возвращать снова в gzip.
6. nbeliaev 09.06.18 19:40 Сейчас в теме
автор, спасибо! актуально
8. GoodZone 9 28.08.18 08:53 Сейчас в теме
Подскажите
ИмяСжатогоФайла="body.json";
это принципиально?
9. Malfarion 200 28.08.18 11:06 Сейчас в теме
(8) На сколько я помню нет.
10. GoodZone 9 29.08.18 09:48 Сейчас в теме
Просто подумал может тег body )), а так проверил все работает на ура. Очень нужная вещь.
11. milanse 35 14.03.19 09:26 Сейчас в теме
Есть задача данные в формате gzip распаковывать из 1С, качнул обработину, в лоб не работает. Данные содержат заголовок gzip. Убрал заголовок, отрезал хвост в соотвествии с форматом, остались только данные deflate результирующий файл 1с не распаковывает. Файл читается 7zip и far, выдает ошибку crc, но данные достает нормально....
Может есть идеи что еще можно подшаманить ?
14. uno-c 158 18.07.19 15:59 Сейчас в теме
(11)
Может есть идеи что еще можно подшаманить ?
Посмотрите описание формата gzip: http://www.zlib.org/rfc-gzip.html Согласно этому описанию, за первыми 10 байтами не обязательно следует deflate. Перед deflate могут присутствовать также имя файла, комментарий и т.д. В случае gzip сжатого тела ответа HTTP они отсутствуют, т.е. за 10 байтами сразу начинается deflate, но для Вашей задачи нужен дальнейший разбор и проверка присутствия комментария, имени файла и проч.
15. milanse 35 18.07.19 19:15 Сейчас в теме
(14) спасибо посмотрю, но пока пришлось решить через ВК.
12. ui69 41 14.06.19 12:17 Сейчас в теме
Автору - спасибо! Работает четко.
13. boogie 484 07.07.19 15:12 Сейчас в теме
16. Dzenn 415 17.02.20 11:31 Сейчас в теме
Спасибо, добрый человек. Не скачивал пока, но верю, что это то, что доктор прописал
17. nDaDe 29.04.20 21:04 Сейчас в теме
Не подскажите как из WinHttp.WinHttpRequest.5.1 получить двоичные данные чтобы распаковать.
Оставьте свое сообщение
Вопросы с вознаграждением