Autor Téma: Problém s REST v Delphi XE6  (Přečteno 237 krát)

Offline KarelHorky

  • Hrdina
  • ****
  • Příspěvků: 271
  • Karma: 10
    • Verze Delphi: XE6, Delphi 10.2 Tokyo
Problém s REST v Delphi XE6
« kdy: 04-08-2022, 11:27:16 »
Zdravím!
Vytvořil jsem testovací program nejdříve v Delphi 10.2. V programu používám REST a autorizuji se na nějaký server. Toto mi chodí, viz obrázek. Přijde mi "bearer" a s tím pak dál pracuji.
Nyní ale nastal problém. Potřebuji zabudovat stejnou funkci také do programu v Delphi XE6. Prakticky stejný kód jako v D10.2 mi v DXE6 končí chybou "REST request failed: Socket Error # 10054", viz druhý obrázek. A nevím proč. Toto je kompletní kód použitý v DXE6, prakticky stejný je v D10.2.
Je nějaký rozdíl v REST mezi DXE6 a D10.2? Něco tam bude, protože IPPeerClient do uses musím dát jen v DXE6. Nebo ví někdo, jak to rozchodit?
Kód: Delphi [Vybrat]
  1. implementation
  2.  
  3. uses
  4.   REST.Client, REST.Types, Soap.EncdDecd, IPPeerClient;
  5.  
  6. {$R *.dfm}
  7.  
  8. procedure TForm1.btnBearerClick(Sender: TObject);
  9. var
  10.   sClientID, sClientSecret, sAccessToken, sOdpoved: string;
  11.   rClient: TRESTClient;
  12.   rRequest: TRESTRequest;
  13.   rResponse: TRESTResponse;
  14.   par: TRESTRequestParameter;
  15. begin
  16.   sOdpoved := '';
  17.   sClientID := 'xxxxxxxxx';
  18.   sClientSecret := 'xxxxxxxxx';
  19.     rClient := TRESTClient.Create('https://xxxxx/api/');  
  20.     try
  21.       rClient.Accept := 'application/json';
  22.       rClient.ContentType := 'application/x-www-form-urlencoded';
  23.       rRequest := TRESTRequest.Create(rClient);
  24.       try
  25.         rResponse := TRESTResponse.Create(rClient);
  26.         try
  27.           try
  28.             rRequest.Client := rClient;
  29.             rRequest.Response := rResponse;
  30.  
  31.             rRequest.Method := rmPOST;
  32.             rRequest.Resource := 'oauth2/token';
  33.             rRequest.Accept := 'application/json';
  34.  
  35.             rRequest.Params.AddItem('Accept','application/json', pkHTTPHEADER,[poDoNotEncode]);
  36.             rRequest.Params.AddItem('Content-Type','application/x-www-form-urlencoded', pkHTTPHEADER,[poDoNotEncode]);
  37.             rRequest.Params.AddItem('Authorization', 'Basic '+Soap.EncdDecd.EncodeString(sClientID+':'+sClientSecret), pkHTTPHEADER,[poDoNotEncode]);
  38.  
  39.             rRequest.Params.AddItem('scope', 'payment-create', pkGETorPOST,[poDoNotEncode]);  
  40.             rRequest.Params.AddItem('grant_type', 'client_credentials', pkGETorPOST,[poDoNotEncode]);
  41.  
  42.             mLog.Lines.Add('Params:');
  43.             for par in rRequest.Params do
  44.               mLog.Lines.Add(par.ToString);
  45.  
  46.             rRequest.Execute;
  47.             mLog.Lines.Add('konec execute');
  48.             mLog.Lines.Add(Format('TotalExecutionTime %d', [rRequest.ExecutionPerformance.TotalExecutionTime]));
  49.  
  50.             mLog.Lines.Add(Format('HTTP status %d %s',[rResponse.StatusCode, rResponse.StatusText]));
  51.             case rResponse.StatusCode of
  52.               200:
  53.                 begin
  54.                   mLog.Lines.Add('Odpoved zpracovana');
  55.                   if rResponse.GetSimpleValue('access_token', sAccessToken) then
  56.                     mLog.Lines.Add('access_token: '+sAccessToken);
  57.                   if rResponse.GetSimpleValue('expires_in', sAccessToken) then
  58.                     mLog.Lines.Add('expires_in: '+sAccessToken);
  59.                 end;
  60.               400:
  61.                 begin
  62.                   sOdpoved := '400 - Spatny pozadavek';
  63.                 end;
  64.               401:
  65.                 begin
  66.                   sOdpoved := '401 - Chyba ve zpracovani na strane serveru';
  67.                 end;
  68.             else
  69.                 begin
  70.                   sOdpoved := 'Neznama odpoved: '+ Format('HTTP status %d %s',[rResponse.StatusCode, rResponse.StatusText]);
  71.                 end;
  72.             end; // case
  73.           except on E: Exception do
  74.             begin
  75.               sOdpoved := 'Chyba: '+E.Message;
  76.             end;
  77.           end;
  78.           if sOdpoved <> '' then
  79.           begin
  80.             mLog.Lines.Add(sOdpoved);
  81.           end;
  82.         finally
  83.           rResponse.Free;
  84.         end;
  85.       finally
  86.         rRequest.Free;
  87.       end;
  88.     finally
  89.       rClient.Free;
  90.     end;
  91. end;
  92.  
Win10 Prof 64b, Firebird 2.5

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3142
  • Karma: 110
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Problém s REST v Delphi XE6
« Odpověď #1 kdy: 04-08-2022, 12:42:37 »
v Delphi 10.3 Rio bylo REST zasadne upraveno (mimo jine nahrazeno Indy za THTTPClient) -
https://docwiki.embarcadero.com/RADStudio/Rio/en/What's_New#Improvements_for_REST

Asi bych pouzil Rest clienta z Delphi MVC frameworku, funguje podle mne i lepe, hlavne ve starsich verzich, a prijde mi i jednodusi. Nejmene jedno demo ukazuje praci s bearer, a nebyla to zadna raketova veda.
Embarcadero MVP - Czech republic

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3142
  • Karma: 110
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Problém s REST v Delphi XE6
« Odpověď #2 kdy: 04-08-2022, 12:46:58 »
napr.

Kód: Delphi [Vybrat]
  1. function TfrmVCLTest.RunGet(const sEndPoint: string; var json: string; const sAccept:string): Boolean;
  2. var
  3.   lClient: IMVCRESTClient;
  4.  lResp: IMVCRESTResponse;
  5.   tick: Cardinal;
  6. begin
  7.   json := '';
  8.   Result := False;
  9.   mAddCommand('Accept:'+sAccept+'                EndPoint:'+sEndPoint);
  10.   tick:= GetTickCount;
  11.   lClient := TMVCRESTClient.New.BaseURL('localhost', 8080);
  12.   lClient.ReadTimeOut(0);
  13.   if not FJWT.IsEmpty then
  14.   begin
  15.     lClient.SetBearerAuthorization(FJWT);
  16.   end;
  17.   // nacti data
  18.   lResp := lClient.Accept(sAccept).Get(sEndPoint);
  19.   if not lResp.Success then
  20.     ShowMessage(lResp.Content)
  21.   else
  22.   begin
  23.     edtInfo.Text := Format('%d bytes, time: %d ms', [lResp.ContentLength, GetTickCount - tick]);
  24.     json := lResp.Content;
  25.     Memo1.Lines.Text := json;
  26.     Result := True;
  27.   end;
  28. end;
  29.  
  30.  
  31. procedure TfrmVCLTest.btnLoginClick(Sender: TObject);
  32. var
  33.   lClient: IMVCRESTClient;
  34.   lRest: IMVCRESTResponse;
  35.   lJSON: TJSONObject;
  36. begin
  37.   lClient := TMVCRESTClient.New.BaseURL('localhost', 8080);
  38.   lClient.ReadTimeOut(0);
  39.   lRest := lClient.Post('/api/login', '{"jwtusername":"Test","jwtpassword":"xx"}');
  40.   mAddCommand('Post:/api/login :->{"jwtusername":"Test","jwtpassword":"xx"}');
  41.  
  42.   if not lRest.Success then
  43.   begin
  44.     ShowMessage(
  45.       'HTTP ERROR: ' + lRest.StatusCode.ToString + sLineBreak +
  46.       'HTTP ERROR MESSAGE: ' + lRest.StatusText + sLineBreak +
  47.       'ERROR MESSAGE: ' + lRest.Content);
  48.  
  49.     Exit;
  50.   end;
  51.  
  52.   lJSON := StrToJSONObject(lRest.Content);
  53.   try
  54.     FJWT := lJSON.S['token'];
  55.     edtToken.Text := FJWT;
  56.   finally
  57.     lJSON.Free;
  58.   end;
  59. end;
  60.  
  61. ...
  62.  
  63.       if not RunGet('/api/site/?viewlayer='+svl.Id, sJson) then
  64.         Exit;
  65.       memInfo.Lines.Add(sJson);
  66.  
  67.  
Embarcadero MVP - Czech republic

Offline KarelHorky

  • Hrdina
  • ****
  • Příspěvků: 271
  • Karma: 10
    • Verze Delphi: XE6, Delphi 10.2 Tokyo
Re:Problém s REST v Delphi XE6
« Odpověď #3 kdy: 04-08-2022, 15:36:48 »
Díky.
Díval jsem se na Delphi.cz, kde o tom píšeš a taky na Github. Stáhnul jsem teda doporučenou verzi dmvcframework-3.2.1-carbon, ale je to jen pro Delphi 10.0 a vyšší. A jak a kde stáhnout něco, co je pro Delphi XE6, tak na to jsem nepřišel. Je tam toho strašně moc.
Ještě budu hledat.
Win10 Prof 64b, Firebird 2.5

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3142
  • Karma: 110
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Problém s REST v Delphi XE6
« Odpověď #4 kdy: 04-08-2022, 15:49:19 »
v tags, https://github.com/danieleteti/delphimvcframework/tags?after=v3.1.1-beryllium-RC1, nekde kolem 3.0, nebo 2.x to urcite podporovalo XE6
Embarcadero MVP - Czech republic

Offline KarelHorky

  • Hrdina
  • ****
  • Příspěvků: 271
  • Karma: 10
    • Verze Delphi: XE6, Delphi 10.2 Tokyo
Re:Problém s REST v Delphi XE6
« Odpověď #5 kdy: 04-08-2022, 16:06:31 »
Ve 3.0.0 to ztratilo podporu pro XE6 a starší.
Ale ve verzích 2.x.x nejsou instalační projekty, jsou to jen zdroje, asi na podívání.
Win10 Prof 64b, Firebird 2.5

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3142
  • Karma: 110
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Problém s REST v Delphi XE6
« Odpověď #6 kdy: 04-08-2022, 16:17:31 »
https://github.com/danieleteti/delphimvcframework/tree/3630dbe07628ca0d18adb79d24b1f2ea8cbc778d
a tam Code->Download.

Pridas adresar Source do cesty a hotovo. Zadne balicky. Ale ja ti to nenutim.
Embarcadero MVP - Czech republic

Offline KarelHorky

  • Hrdina
  • ****
  • Příspěvků: 271
  • Karma: 10
    • Verze Delphi: XE6, Delphi 10.2 Tokyo
Re:Problém s REST v Delphi XE6
« Odpověď #7 kdy: 05-08-2022, 08:07:05 »
Já to určitě vyzkouším. Jen mně zarazilo, že ve verzích 3.x.x se to instaluje a 2.x.x nemá ty instalační projekty. Pokud to bude jako Synapse, tak to bude OK. Stejně jsem to chtěl vytvářet za běhu, stejně jako v příkladu s REST z Delphi.
Ještě jednou děkuju.
Win10 Prof 64b, Firebird 2.5

Offline KarelHorky

  • Hrdina
  • ****
  • Příspěvků: 271
  • Karma: 10
    • Verze Delphi: XE6, Delphi 10.2 Tokyo
Re:Problém s REST v Delphi XE6
« Odpověď #8 kdy: 08-08-2022, 10:15:33 »
V pátek jsem to různě testoval a zkoušel. Pokud by nebylo potřeba SSL, tak bych asi uspěl.
Všechno však končí na zastaralé verzi Indy v Delphi XE6. Funkce teď končí hlášením:

Error connecting with SSL.
error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol

Dohledával jsem, jak to opravit a pomohlo jen přeinstalovat Indy na novější verzi. To dělat nebudu.
V dnešní době je XE6 zastaralé, asi nezbude, než přejít na něco novějšího.
Win10 Prof 64b, Firebird 2.5

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3142
  • Karma: 110
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Problém s REST v Delphi XE6
« Odpověď #9 kdy: 14-08-2022, 17:06:11 »
V pátek jsem to různě testoval a zkoušel. Pokud by nebylo potřeba SSL, tak bych asi uspěl.
Všechno však končí na zastaralé verzi Indy v Delphi XE6. Funkce teď končí hlášením:

Error connecting with SSL.
error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol

Dohledával jsem, jak to opravit a pomohlo jen přeinstalovat Indy na novější verzi. To dělat nebudu.
V dnešní době je XE6 zastaralé, asi nezbude, než přejít na něco novějšího.


Zkus v tech starych Indy pouzit SChannel - https://delphi.cz/post/SChannel-TLS-pro-Indy.aspx
Embarcadero MVP - Czech republic