• 0
notricky

Архивирование/компрессия данных запроса TRestRequest через GZip

Вопросы

Собственно есть способ получать и распаковывать данные, полученные в GZIP.

В качестве примера:

procedure TFMain.FormCreate(Sender: TObject);
begin
  (ReqGet.Client.HTTPClient.Peer.GetObject as TIdCustomHTTP).Compressor := 
     TIdCompressorZLib.Create(ReqGet.Client.HTTPClient.Peer.GetObject as TIdCustomHTTP);
  ReqGet.AcceptEncoding := 'gzip,deflate';
...
end;

А вот как их отправить (как запаковать - механизм? и куда подставить строку) - не понятно.

Отправка интересует и POST и GET

Прошу помощи.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 ответов на этот вопрос

  • 0
1 час назад, notricky сказал:

Собственно есть способ получать и распаковывать данные, полученные в GZIP.

В качестве примера:


procedure TFMain.FormCreate(Sender: TObject);
begin
  (ReqGet.Client.HTTPClient.Peer.GetObject as TIdCustomHTTP).Compressor := 
     TIdCompressorZLib.Create(ReqGet.Client.HTTPClient.Peer.GetObject as TIdCustomHTTP);
  ReqGet.AcceptEncoding := 'gzip,deflate';
...
end;

А вот как их отправить (как запаковать - механизм? и куда подставить строку) - не понятно.

Отправка интересует и POST и GET

Прошу помощи.

что за код такой??

если хотите отправить и получить сжатые данные, то используйте System.ZLib (если не ошибаюсь)

если использовать Indy (не рекомендую), то там есть специальный компонент TIdCompressorZLib

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Речь про TRestRequest.

Код - чтобы подключить декомпрессию в "авторежиме" (можно еще мануально декомпрессить RawBytes)

А вот как делать компрессию и отправлять в GZIP-е - в этом состоит вопрос.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
Только что, notricky сказал:

Речь про TRestRequest.

Код - чтобы подключить декомпрессию в "авторежиме" (можно еще мануально декомпрессить RawBytes)

А вот как делать компрессию и отправлять в GZIP-е - в этом состоит вопрос.

ответ дан выше, посмотрите внимательно

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

TRestRequets содержит внутренний компонент IdHttp, который, имея, property Compressor умеет декомпрессировать сжатые данные автоматически. Но доступ к нему извне не дан, потому код для того, чтобы получить к нему доступ.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
8 минут назад, ZuBy сказал:

ответ дан выше, посмотрите внимательно

Я посмотрел. Ответ не дан.

Конкретный код не гуглится по теме compresson - Только по теме decompression

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
5 минут назад, notricky сказал:

TRestRequets содержит внутренний компонент IdHttp, который, имея, property Compressor умеет декомпрессировать сжатые данные автоматически. Но доступ к нему извне не дан, потому код для того, чтобы получить к нему доступ.

такс, давайте сначала.

1) Делфи какая стоит?

2) это родной TRestRequest?

3) там нет idHTTP!

4) компрессор/декомпрессор делается через модуль System.Zlib 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Вопрос именно в том как, а не что  использовать для компрессии.

Допустим есть строка, которую нужно сжать и подставить ее... куда? в значение параметра? А если GET?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

1. В тегах указана версия Дельфи. XE7

2. Родной

3. тем не менее работает: ReqGet.Client.HTTPClient.Peer.GetObject as TIdCustomHTTP

4. Как на конкретном примере строки сделать компрессию и подставить полученное... куда? в какое место RestRequest?

Изменено пользователем notricky

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Допустим для примера:

http://site.com/?data=aaaaabbbbbcccccddddd

Как верно енкодить "aaaaabbbbbcccccddddd"? и куда подставить в коде?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

незнаю, что и как в XE7 (она уже не жилец)

но если бы вы посмотрели что из себя представляет модуль System.Zlib, то было бы понятно

var
  zs: TZDecompressionStream;
  Mem: TMemoryStream;
begin
  Mem := TMemoryStream.Create;
  zs := TZDecompressionStream.Create(Mem);
ZDecompressStr()
ZCompressStr()

дальше наверное разберетесь, как это отправить в TRestRequest. т.к. в новых делфях не используется "внутри" TIdHTTP

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
45 минут назад, ZuBy сказал:

незнаю, что и как в XE7 (она уже не жилец)

но если бы вы посмотрели что из себя представляет модуль System.Zlib, то было бы понятно


var
  zs: TZDecompressionStream;
  Mem: TMemoryStream;
begin
  Mem := TMemoryStream.Create;
  zs := TZDecompressionStream.Create(Mem);

ZDecompressStr()
ZCompressStr()

дальше наверное разберетесь, как это отправить в TRestRequest. т.к. в новых делфях не используется "внутри" TIdHTTP

Ок, все это на поверхности, но кода на компрессию все так же нет.

А как в новых делфях осуществить отправку архивированного именно в GZIP методом GET?

Я вот не могу разобраться.

Интерес в том, что для декомпрессии в GZIP используется FZlib.DecompressGZipStream

Но вот аналогичного FZlib.СompressGZipStream - НЕТ! Это первое. Второе. Получу я RawData или String - дальше что делать? Подставлять как обычное значение параметра в Params.ParameterByName().value?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти


  • Похожий контент

    • От YPOK5C
      Добрый день ! Кто подсказки почему при компиляции приложения под Андроид через USB выдаёт такие ошибки, при этом все apk файлы создаётся все они рабочие.  Unable to crete process unable to install Failure install failed update incompatible

    • От Rionn
      В этой ссылке показан пример работы в одной сети (написано курсивом). Не могу найти, чтобы PC работал по сети или по WiFi, а телефон по мобильным данным. Не подскажете?
    • От Ufomaster
      У кого есть рабочий пример получения бинарного файла из дроб бокса ?  REST;  Текстовый принимает, а бинарный нет. Помогите. 
    • От notricky
      Возникает вышеозначенная ошибка при попытке декодировать приходящий от сервера текст.
      Я пробовал в различных вариантах.
      http://www.fmxexpress.com/secure-your-rest-client-with-ssl-and-gzip-compression-in-delphi-xe8-firemonkey-on-android-and-ios/
      http://www.fmxexpress.com/decode-gzip-content-from-the-rest-client-in-delphi-xe7-firemonkey-on-android-and-ios/  
       
      Я получаю либо  ошибку из названия темы, либо  Error on call to ZLib library function inflateInit2_

      В общем не работает только на iOS (iPhone).
      На Android, Windows, MacOS работает корректно декомпрессия в автоматическом режиме, потому вопроса о строках не возникает.
    • От Равиль Зарипов (ZuBy)
      Доброго времени суток!
      Навеяно этой темой.
      Посмотрел реализацию от @Pax Beach (за что ему спасибо большое) и столкнулся с тем что TRESTClient со всеми потрахами это просто дикий ужас.
      Решил собрать аналогичный пример, только не использовать TREST***
      немного опишу, свою реализацию
      uAppSettings.pas - хранит описание вашего приложения созданного в ВК  FMX.RESTLight.pas - модуль "общения" клиента с сервером FMX.RESTLight.Types.pas - тут хранятся типы для работы TRESTLight Приведу код, который постит Вам на стену текст
      var aFields: TArray<TmyRestParam>; aJSON: string; begin SetLength(aFields, 5); aFields[0] := TmyRestParam.Create('access_token', FAuthToken.token, false); aFields[1] := TmyRestParam.Create('v', FVKApp.APIVersion, false); aFields[2] := TmyRestParam.Create('owner_id', FAuthToken.user_id, false); aFields[3] := TmyRestParam.Create('friends_only', '0', false); aFields[4] := TmyRestParam.Create('message', 'Тестовое сообщение <RESTLight>', false); TTask.Run( procedure begin aJSON := TRESTLight.Execute('wall.post', FVKApp, aFields); TThread.Synchronize(TThread.CurrentThread, procedure begin Memo1.Lines.Add('---- wall.post ----'); Memo1.Lines.Add(aJSON); end); end); а вот так можно заливать файлы
      var aFields: TArray<TmyRestParam>; aJSON: string; begin SetLength(aFields, 4); aFields[0] := TmyRestParam.Create('access_token', FAuthToken.token, false); aFields[1] := TmyRestParam.Create('v', FVKApp.APIVersion, false); aFields[2] := TmyRestParam.Create('owner_id', FAuthToken.user_id, false); aFields[3] := TmyRestParam.Create('photo', aUploadFile, true); // для файлов указывается !!!true!!! TTask.Run( procedure begin // для загрузки файлов использовать TRESTLight.Execute2, в нем можно указать произвольный URL aJSON := TRESTLight.Execute2(aUploadURL, FVKApp, aFields); TThread.Synchronize(TThread.CurrentThread, procedure begin Memo1.Lines.Add('---- upload file to server ----'); Memo1.Lines.Add(aJSON); end); end); P.S. На правильность и оригинальность не претендую, просто альтернативный вариант. Мне например не понравилась как устроен TRESTClient, много компонентов лишних. В боевых условиях наверное код еще будет модернизироваться, я рассмотрел только пару методов, но думаю общая концепция не сильно поменяется
      GitHub   TRESTLight.zip
    • От notricky
      Не нашел тега TPopup. Напишу тут.
      Ситуация в следующем. Я использую TPopup + TCalloutPanel для хинтов (подсказок). С анимацией FadeIn FadeOut.
      Все вроде просто.
      На основной форме есть стандартная проверка FormKeyDown
      if Key in [vkHardwareBack] then begin TPlatformServices.Current.SupportsPlatformService(IFMXVirtualKeyboardService, IInterface(FService)); if (FService <> nil) and (TVirtualKeyboardState.Visible in FService.VirtualKeyBoardState) then begin DebugLog('KeyboardOnBackButton'); end else begin Key := 0; if ItemLayout.Visible then begin DebugLog('ItemLayoutBackButton'); btCancelClick(btCancel); end else begin DebugLog('MainLayoutBackButton'); MessageDlg('Are you sure to exit now?', TMsgDlgType.mtConfirmation, [TMsgDlgBtn.mbOK, TMsgDlgBtn.mbCancel], -1, procedure (const AResult: TModalResult) begin if AResult = mrOk then begin DebugLog('CloseOnBackButton'); Close; end; end); end; end; end В общем ничего сверхестественного.
      Затем, когда появляется хинт:
      procedure TFParent.ShowHint(AControl: TControl; AText: string; ATitle: string=''; Duration: single = 3; ImageIndex: integer = -1); begin DebugLog('ShowHint'); lbHint.Text := AText; puHint.PlacementTarget := AControl; faHintFadeOut.Delay := Duration; puHint.IsOpen := true; ivHint.Visible := ImageIndex <> -1; lbHintTitle.Text := ATitle; lbHintTitle.Visible := ATitle <> ''; end; все тоже хорошо. Однако, когда я нажимаю кнопку назад - сначала пропадает хинт. А если я нажимаю снова кнопку назад, то вообще говоря я жду два варианта:
      ItemLayout переходит в MainLayout Программа запрашивает выход MessageDlg Но на деле приложение просто закрывается. При чем без ошибок.
      Что с этим можно сделать?
    • От Alexey Shumkin
      Для работы с USB-устройствами (на девайсах с USB-хостом) нужно использовать BroadcastReceiver.
      Нашёл пример работы с ними (https://github.com/freeonterminate/delphi/tree/master/BroadcastReceiver). 
      Проверял на XE10. Долго мучался с проверкой, пока не выяснилось, что под XE7 работает, а под XE10 - нет.
      Выдаёт ошибку "Interface not supported" в момент создания JFMXBroadcastReceiver (или около того, точно непонятно).
      Для демонстрации я создал отдельный простой проект - https://github.com/ashumkin/Delphi-Android-BroadcastSample.
      В XE7 он работает (при нажатии на кнопку Register вешается слушатель, который ловит и выводит в лог (см. adb logcat) события включения/выключения экрана). А в XE10 - выдаёт вышеупомянутую ошибку "Interface not supported".
      В логах есть строки
      W/dalvikvm(31735): dvmFindClassByName rejecting 'com/embarcadero/firemonkey/broadcast/FMXBroadcastReceiverListener'
      W/dalvikvm(31735): dvmFindClassByName rejecting 'com/embarcadero/firemonkey/broadcast/FMXBroadcastReceiver'
      (но они есть и при запуске приложения, собранного в XE7)
      Пробовал по-разному: и удалял AndroidManifest.template.xml от XE7, и пересоздавал .dproj в XE10, - пофик.
      В чём засада?
    • От Fabiano da Silva
      как создать чат между людьми
      Android Делфи? может кто-нибудь помочь?
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу