• 0
Равиль Зарипов (ZuBy)

TRESTClietn TRESTLight - облегченная версия

Вопрос

Доброго времени суток!

Навеяно этой темой.

Посмотрел реализацию от @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

Изменено пользователем ZuBy
Steepe_Hare, wamaco, AlexG и 4 другим понравилось это

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


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

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

  • 0
7 часов назад, ZuBy сказал:

P.S. На правильность и оригинальность не претендую, просто альтернативный вариант. Мне например не понравилась как устроен TRESTClient, много компонентов лишних. В боевых условиях наверное код еще будет модернизироваться, я рассмотрел только пару методов, но думаю общая концепция не сильно поменяется

Интересно изучить в качестве альтернативного взгляда на проблему. Спасибо!

Но сам буду пользоваться стандартной тяжелой и кривой конструкцией TRestClient-Request-Response.

Потому что самое сложное в интеграции с API — это не методы вызвать и ответы от них обработать. Самый сок — настроить приложения в соцсетях, выпустить фингерпринты для iOS-Android-Win, обосновать техподдержке соцсети нужность и полезность для пользователей вашего приложения, поддерживать минимальное количество ошибок вызовов API, корректность публикуемого содержания и соответствия нормам каждой соцсети, делать это для каждой соцсети VK-FB-Insta-OK-G+, иметь возможность повысить версию RAD Studio и не уронить все эти приложения (15 штук + web-реализации).

После этого, использовать компоненты и модули, которые скорее всего не будут сопровождаться через 1-2 года что-то не хочется )

 

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


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

Самый сок — настроить приложения в соцсетях, выпустить фингерпринты для iOS-Android-Win, обосновать техподдержке соцсети нужность и полезность для пользователей вашего приложения, поддерживать минимальное количество ошибок вызовов API, корректность публикуемого содержания и соответствия нормам каждой соцсети, делать это для каждой соцсети VK-FB-Insta-OK-G+, иметь возможность повысить версию RAD Studio и не уронить все эти приложения (15 штук + web-реализации).

После этого, использовать компоненты и модули, которые скорее всего не будут сопровождаться через 1-2 года что-то не хочется )

 

может я что-то не понимаю, но это никак не относится к TRESTClient. оно из коробки ничего не умеет, это такие же вызовы POST/GET просто обвешанные типами, классами, компонентами, зависимостями. Т.к. стандартов для протокола REST не существует, каждая соц сеть делает так как удобно.

на счёт сопровождения, тут и думать нечего: если загнется TNetHTTPClient, то и TRESTClient упадёт. И не используйте уже IdHTTP, он устарел и косячит на HTTPS

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


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

на счёт сопровождения, тут и думать нечего: если загнется TNetHTTPClient, то и TRESTClient упадёт. И не используйте уже IdHTTP, он устарел и косячит на HTTPS

Тут я согласен, спасибо за подсказку.

Просто хотел сказать о том, что зачастую хочется использовать практики, которые работают, просто отлаживаются, легко обновляются/сопровождаются. Потому что много не менее важных и трудоемких дел вокруг разработки — дизайн, тестирование, продакшн, развитие, маркетинг, маркетинг, маркетинг )

 

 

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


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

Тут я согласен, спасибо за подсказку.

Просто хотел сказать о том, что зачастую хочется использовать практики, которые работают, просто отлаживаются, легко обновляются/сопровождаются. 

вот тут вы ошиблись) я час убил разбираясь в потрохах TREST***, там ничего не делается просто)

Если хотите просто отлаживать и сопровождать, напишите подобный модуль и забудьте про TRESTClient.

P.S. Если вы занимаетесь апи для FB, покажите реализацию? я попробую сделать аналог на TRESTLight

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


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

вот тут вы ошиблись) я час убил разбираясь в потрохах TREST***, там ничего не делается просто)

Если хотите просто отлаживать и сопровождать, напишите подобный модуль и забудьте про TRESTClient.

P.S. Если вы занимаетесь апи для FB, покажите реализацию? я попробую сделать аналог на TRESTLight

Нет времени для этого раньше понедельника. Как сделаю, выложу, конечно в соседней теме.

Равиль Зарипов (ZuBy) понравилось это

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


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

классная вещь, спасибо.

скажите, пожалуйста, а можно залогиниться, один раз указав логин и пароль, а потом сохранив данные, логиниться автоматически?

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


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

думаю можно.

при получении токена там еще отдается время до которого будет валиден токен.

пока этот токен валиден, его можно указывать в апи, как только время прошло нужно снова запросить

Steepe_Hare понравилось это

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


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

думаю можно.

при получении токена там еще отдается время до которого будет валиден токен.

пока этот токен валиден, его можно указывать в апи, как только время прошло нужно снова запросить

скажите пожалуйста, а это сообщение внизу окна авторизации "This window will close automatically when a token could be detected and extracted."  принадлежит MS Internet Browser?

Можно как-то кастомизировать окно авторизации?

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


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

да, это от IE, кастомизировать нельзя его и не нужно, даже если возможно. Иначе будет недоверие пользователей к стандартному способу авторизации через OAuth

Steepe_Hare понравилось это

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


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

да, это от IE, кастомизировать нельзя его и не нужно, даже если возможно. Иначе будет недоверие пользователей к стандартному способу авторизации через OAuth

спасибо.

а еще один вопрос можно?

у вас в исходнике есть такое:

class function TmyVKApp.APIVersion: string;
begin
  Result := '5.53';
end;

это нужно менять со временем и влияет ли это на что-то?

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


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

спасибо.

а еще один вопрос можно?

у вас в исходнике есть такое:


class function TmyVKApp.APIVersion: string;
begin
  Result := '5.53';
end;

это нужно менять со временем и влияет ли это на что-то?

это версия ВК апи, поменяете если какой-то метод просит более новую версию

Steepe_Hare понравилось это

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


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

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

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

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

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


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

Войти

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


Войти сейчас

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

    • Автор: 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 работает корректно декомпрессия в автоматическом режиме, потому вопроса о строках не возникает.
    • Автор: 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
      Прошу помощи.
    • Автор: Равиль Зарипов (ZuBy)
      Компонент TMapsEngine
       
      Возможности
      Нативный LocationSensor [ANDROID] Геокодинг/Реверс геокодинг через Google API, Yandex API, Here Maps API Построение маршрута через Google Distance API Расчет дистанции по прямой Совместим со стандартным компонентом TLocationSensor  
      Видео демонстрация
       
      На видео видно как TMapView косячик с миллионом точек, приложение зависло при отрисовке, но с этим ничего не поделать.
      Без синхронизации не возможно отрисовать все точки
       
      Исходник
      TMapsEngine_source.zip
      TMapsEngine_Seattle_10.zip
       
      Скачать APK  (долго он там не пролежит, а форум не позволяет загрузить zip размером 7,4 мб )
       
    • Автор: Pax Beach
      Я реализовал пример работы с микрофоном и таймером в Android сервисе, как указано в теме вопроса.
      Каждый раз, когда вы отправляете в сервис StartCommand или сервис перезапускается, включается запись с микрофона, и сохраняется в каталог с музыков в файл "myrecord.3gp".
      Надеюсь, мой пример поможет вам создать новые полезные решения. В этом случае пожалуйста делитесь ими с участниками нашего сообщества.
      Для отладки своих программ на Android используйте запись в LOGI и чтение при помощи monitor.bat (PlatformSDKs\android-sdk-windows\tools).
       
      uses ... AndroidApi.JNI.Media, // JMediaRecorder AndroidApi.Timer, // Timer ...; Const TimerInterval = 1000; TimerCounterSecLimit = 10; type TDM = class(TAndroidService) ... private FTimerHandle: Integer; FRecording: Boolean; procedure StartRecord; procedure StopRecord; procedure StartTimer; procedure StopTimer; public FAudioRec: JMediaRecorder; end; procedure Log(const Fmt: string; const Params: array of const); overload; var Msg: string; M: TMarshaller; begin Msg := Format(Fmt, Params); LOGI(M.AsUtf8(Msg).ToPointer); end; procedure Log(const Source: string); overload; var M: TMarshaller; begin LOGI(M.AsUtf8(Source).ToPointer); end; procedure TDM.AndroidServiceCreate(Sender: TObject); begin FTimerHandle := 0; FTimerCounter := 0; FRecording := false; end; procedure TDM.AndroidServiceDestroy(Sender: TObject); begin StopTimer; StopRecord; end; function TDM.AndroidServiceStartCommand(const Sender: TObject; const Intent: JIntent; Flags, StartId: Integer): Integer; begin if Intent.getAction.equalsIgnoreCase(StringToJString('StopIntent')) then begin StopTimer; StopRecord; Result := TJService.JavaClass.START_NOT_STICKY; // don't reload service Log('- service stoped', []); end else begin if not FRecording then begin Log('... sound record to be started', []); StartRecord; StartTimer; end; Result := TJService.JavaClass.START_STICKY; // rerun service if it stops Log('+ Service started', []); end; end; procedure TDM.StartRecord; begin StopRecord; FAudioRec := TJMediaRecorder.Create; FAudioRec.setAudioSource(TJMediaRecorder_AudioSource.JavaClass.MIC); FAudioRec.setOutputFormat(TJMediaRecorder_OutputFormat.JavaClass.THREE_GPP); FAudioRec.setAudioEncoder(TJMediaRecorder_AudioEncoder.JavaClass.AMR_NB); FAudioRec.setOutputFile(StringToJString(TPath.Combine(TPath.GetSharedMusicPath, 'myrecord.3gp'))); try FAudioRec.Prepare(); FAudioRec.start; FRecording := True; Log('+ Start record to %s', [TPath.Combine(TPath.GetSharedMusicPath, 'myrecord.3gp')]); except on E: Exception do Log('- Error in mic recording: %s', [E.Message]); end; end; procedure TDM.StopRecord; begin if Assigned(FAudioRec) then begin if FRecording then begin FRecording := false; try FAudioRec.stop(); FAudioRec.release(); Log('- Mic recording is stoped'); except on E: Exception do Log('- Error in mic stop recording: %s', [E.Message]); end; end; end else begin FRecording := false; end; end; procedure TDM.WaitComplete(TimerId: Integer); begin if FTimerCounter < TimerCounterSecLimit then begin Log('+++ Timer is triggered %d time.', [FTimerCounter]); inc(FTimerCounter); end else StopTimer; end; procedure TDM.StartTimer; begin FTimerCounter := 0; if FTimerHandle = 0 then begin FTimerHandle := AndroidTimerCreate; AndroidTimerSetInterval(FTimerHandle, TimerInterval); end; AndroidTimerSetHandler(WaitComplete); Log('+ Timer started', []); end; procedure TDM.StopTimer; begin if FTimerHandle > 0 then begin Log('... MIC recording to be stopped'); StopRecord; AndroidTimerSetHandler(nil); Log('- Timer stoped', []); end; end; end.  
    • Автор: magicxor
      Добрый день.
      Как использовать API WindowsRT для шифрования? (https://msdn.microsoft.com/en-us/library/windows/apps/windows.security.cryptography.core.aspx)
      Конкретно - интересует RSA, генерация пары ключей, импорт/экспорт в файл, шифрование и дешифрование строки.
      Для начала я пытаюсь просто получить названия алгоритмов шифрования, чтоб потом их использовать. Даже не возвращаю их пока из функции, просто получаю:
       
      uses System.Threading, System.Types, System.Win.ComObj, Winapi.Security.Cryptography, Winapi.Foundation, Winapi.Foundation.Collections, Winapi.Storage.Streams, Winapi.CommonTypes, Winapi.Foundation.Types, Winapi.Winrt, System.Win.Winrt; procedure TForm1.Button1Click(Sender: TObject); var AsymmetricAlgoNames: Core_IAsymmetricAlgorithmNamesStatics; AsymmetricAlgoNamesInsp: IInspectable; GetAlgoNames: IFuture<boolean>; begin GetAlgoNames := TTask.Future<boolean>( function: boolean begin OleCheck(RoInitialize(RO_INIT_MULTITHREADED)); try OleCheck(RoGetActivationFactory(TWindowsString(SCore_AsymmetricAlgorithmNames), Core_IAsymmetricAlgorithmNamesStatics, AsymmetricAlgoNamesInsp)); AsymmetricAlgoNames := AsymmetricAlgoNamesInsp as Core_IAsymmetricAlgorithmNamesStatics; finally RoUninitialize; end; Result := true; end); GetAlgoNames.Start; end;  
      После нажатия на кнопку:
      И сразу:
      Но иногда (рандомно) вместо первого исключения получаю:
       
      IFuture использую потому что если это делать в потоке гуя, при вызове RoInitialize ругается, что поток уже запущен и нельзя изменить его состояние.
      Delphi 10 Seattle, Windows 10 x64.
    • Автор: 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; что я не так делаю?
    • Автор: Axbor
      пишу uses Androidapi.JNI.Media, AndroidApi.Helpers; выдает ошибку. Я ни разу не работал с андроид API помогите пожалуйста, что я делаю не так?
  • Сейчас на странице   0 пользователей

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