• 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

незнаю, что и как в 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?

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


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

Создайте аккаунт или войдите для комментирования

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

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас

  • Похожие публикации

    • Автор: 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 Делфи? может кто-нибудь помочь?
    • Автор: SergeyIT
      Что то нелепое. Помогите, плиз, разобраться.
      Ничего не кроме формы.
      Любой вызов
      client:= TRESTClient.Create('http://www.google.com'); с любым адресом приводит к появлению

    • Автор: Syb
      Я могу совсем что то не правильно делать, хочу получить данные согласно API :
       
       
      http://glonasssoft.ru/wiki/?wiki_name=API
      var jValue:TJSONValue; s,s1:string; begin RestClient1.BaseURL:='http://dev.glonasssoft.ru/auth/login'; Restrequest1.Execute; jValue:=RESTResponse1.JSONValue; s:=jValue.ToString; s1:= copy(s,pos('AuthID:"',s)+11,pos('","U',s)-pos('AuthID:"',s)-11);//достал ключ RestClient2.BaseURL:='http://dev.glonasssoft.ru/vehicles_'; Restrequest2.Params[0].Value:=s1; -здесь параметр типа HttpHeader задан X-Auth в него сую ключ Restrequest2.Execute; - говорит не авторезирован jValue:=RESTResponse2.JSONValue; s:=jValue.ToString; что я не так делаю?
  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу