Autor Téma: Delphi a volani API v JSON a jeho uprava  (Přečteno 1205 krát)

Offline Kony

  • Hrdina
  • ****
  • Příspěvků: 376
  • Karma: 1
    • Verze Delphi: Delphi 7
Delphi a volani API v JSON a jeho uprava
« kdy: 19-05-2023, 12:25:01 »
Mám aplikaci, kterou mam nasazenou u vyrobni linky, ktera vyrabi spulky... Nyni to mam tak, ze obsluha linky pri kazde spulce nacte EAN a ten se ulozi do SQL, po cele smene zmackne button odeslat vyrobu a me na mail prijde vycet toho co se a kolik toho udelalo a to nasledne soucet pripocitam do e-shopu ke skladu.
e-shop ma JSON API a tak me napadlo, jestli by nebylo mozne vzdy pri nacteni EAN zavolat toto API a ulozit "stav skladu +1"

neco jako abych pri nacteni EAN nacetl pres JSON stav skladu, pripocital +1 a nasledne odeslal pres API novy stav skladu...

Offline Kony

  • Hrdina
  • ****
  • Příspěvků: 376
  • Karma: 1
    • Verze Delphi: Delphi 7
Re:Delphi a volani API v JSON a jeho uprava
« Odpověď #1 kdy: 19-05-2023, 13:28:25 »
Tak se snazim :
Kód: Delphi [Vybrat]
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  7.   Vcl.Controls, Vcl.Forms, Vcl.Dialogs,System.IOUtils, System.JSON, System.Generics.Collections,
  8.   Vcl.StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
  9.   IdHTTP, IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack, IdSSL, IdSSLOpenSSL;
  10.  
  11. type
  12.   TForm1 = class(TForm)
  13.     Label1: TLabel;
  14.     IdHTTP1: TIdHTTP;
  15.     IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL;
  16.     procedure FormCreate(Sender: TObject);
  17.   private
  18.     { Private declarations }
  19.   public
  20.     { Public declarations }
  21.   end;
  22.  
  23. var
  24.   Form1: TForm1;
  25.   mydata : string;
  26.  
  27. implementation
  28.  
  29. {$R *.dfm}
  30.  
  31. function GetURLAsString(const aurl:  string): string;
  32. var
  33.   lHTTP: TIdHTTP;
  34. begin
  35.   lHTTP := TIdHTTP.Create(nil);
  36.   try
  37.     lHTTP.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(lHTTP);
  38.     Result := lHTTP.Get(aURL);
  39.   finally
  40.     lHTTP.Free;
  41.   end;
  42. end;
  43.  
  44. procedure TForm1.FormCreate(Sender: TObject);
  45. procedure GetPrices(const S: string);
  46.   var
  47.     V: TJsonValue;
  48.     O, E, P: TJsonObject;
  49.     A: TJsonArray;
  50.   begin
  51.     V := TJSONObject.ParseJSONValue(S);
  52.     if not Assigned(V) then
  53.       raise Exception.Create('Invalid JSON');
  54.     try
  55.       O := V as TJSONObject;
  56.       A := O.GetValue<TJsonArray>('products');
  57.       for var I := 0 to A.Count - 1 do
  58.       begin
  59.         E := A.Items[I] as TJsonObject; // Element
  60.         P := E.GetValue<TJsonObject>('0');
  61.         ShowMessage('Value: ' + P.GetValue<string>('stock') + '  ' + 'stock_position: ' +  P.GetValue<string>('stock_position'));
  62.       end;
  63.     finally
  64.       V.Free;
  65.     end;
  66.   end;
  67.  
  68. var
  69.   S: string;
  70.   LJsonObj   : TJSONObject;
  71.   LJsonValue : TJSONValue;
  72. begin
  73.     mydata := GetURLAsString('https://adresa_k_serveru_API2/products?codes=AAAAAA');
  74.     LJsonObj    := TJSONObject.ParseJSONValue(TEncoding.Default.GetBytes(mydata),0) as TJSONObject;
  75.   try
  76.      LJsonValue := LJsonObj.Get('last').JsonValue;
  77.      Label1.Caption:= LJsonValue.Value;
  78.   finally
  79.      LJsonObj.Free;
  80.   end;
  81. end;
  82.  
  83.  
  84. end.
  85.  

ale narážím na problém s SSL. Kompiluji pro Windows32.. do adresare s aplikaci jsem nahral soubory ssleay32.dll a libeay32.dll, ale stejne stale hlasi chybu SSL
Pise mi to presne : "Project Project1.exe raised exception class EIdOSSLCouldNotLoadSSLLibrary with message 'Could not load SSL library.'."
« Poslední změna: 19-05-2023, 13:30:53 od Kony »

Offline Jan Fiala

  • Hrdina
  • ****
  • Příspěvků: 442
  • Karma: 6
    • Verze Delphi: 10.4.1
    • PSPad editor
Re:Delphi a volani API v JSON a jeho uprava
« Odpověď #2 kdy: 20-05-2023, 18:25:44 »
Pouzij TNetHTTPClient misto InDy. Ten vyuziva systemove HTTPS.
Pro indy potrebujes odpovidajici OpenSSL komponenty, ty o kterych pises jsou hoodne stare a derave.

Offline Kony

  • Hrdina
  • ****
  • Příspěvků: 376
  • Karma: 1
    • Verze Delphi: Delphi 7
Re:Delphi a volani API v JSON a jeho uprava
« Odpověď #3 kdy: 21-05-2023, 21:17:02 »
Tak jsem prekopal na :
Kód: Delphi [Vybrat]
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  7.   Vcl.Controls, Vcl.Forms, Vcl.Dialogs,System.IOUtils, System.JSON, System.Generics.Collections,
  8.   Vcl.StdCtrls,System.Net.URLClient, System.Net.HttpClient, System.Net.HttpClientComponent;
  9.  
  10. type
  11.   TForm1 = class(TForm)
  12.     Label1: TLabel;
  13.     NetHTTPClient1: TNetHTTPClient;
  14.     procedure FormCreate(Sender: TObject);
  15.   private
  16.     { Private declarations }
  17.   public
  18.     { Public declarations }
  19.   end;
  20.  
  21. var
  22.   Form1: TForm1;
  23.   mydata : string;
  24.  
  25. implementation
  26.  
  27. {$R *.dfm}
  28.  
  29. function GetURLAsString(const aurl:  string): string;
  30. var
  31.   lHTTP: TNetHTTPClient;
  32. begin
  33.   lHTTP := TNetHTTPClient.Create(nil);
  34.   try
  35.     Result := lHTTP.Get(aURL);
  36.   finally
  37.     lHTTP.Free;
  38.   end;
  39. end;
  40.  
  41. procedure TForm1.FormCreate(Sender: TObject);
  42. procedure GetPrices(const S: string);
  43.   var
  44.     V: TJsonValue;
  45.     O, E, P: TJsonObject;
  46.     A: TJsonArray;
  47.   begin
  48.     V := TJSONObject.ParseJSONValue(S);
  49.     if not Assigned(V) then
  50.       raise Exception.Create('Invalid JSON');
  51.     try
  52.       O := V as TJSONObject;
  53.       A := O.GetValue<TJsonArray>('products');
  54.       for var I := 0 to A.Count - 1 do
  55.       begin
  56.         E := A.Items[I] as TJsonObject; // Element
  57.         P := E.GetValue<TJsonObject>('0');
  58.         ShowMessage('Value: ' + P.GetValue<string>('stock') + '  ' + 'stock_position: ' +  P.GetValue<string>('stock_position'));
  59.       end;
  60.     finally
  61.       V.Free;
  62.     end;
  63.   end;
  64.  
  65. var
  66.   LJsonObj   : TJSONObject;
  67.   LJsonValue : TJSONValue;
  68. begin
  69.     mydata := GetURLAsString('https://server_API/api/v2/products?codes=AAAA');
  70.     LJsonObj    := TJSONObject.ParseJSONValue(TEncoding.Default.GetBytes(mydata),0) as TJSONObject;
  71.   try
  72.      LJsonValue := LJsonObj.Get('last').JsonValue;
  73.      Label1.Caption:= LJsonValue.Value;
  74.   finally
  75.      LJsonObj.Free;
  76.   end;
  77. end;
  78.  
  79.  
  80. end.
  81.  
a hlasí chybu na řádku :
Kód: Delphi [Vybrat]
  1.   Result := lHTTP.Get(aURL);
[dcc32 Error] Unit1.pas(35): E2010 Incompatible types: 'string' and 'IHTTPResponse'


Offline Jan Fiala

  • Hrdina
  • ****
  • Příspěvků: 442
  • Karma: 6
    • Verze Delphi: 10.4.1
    • PSPad editor
Re:Delphi a volani API v JSON a jeho uprava
« Odpověď #4 kdy: 22-05-2023, 09:44:14 »
Protože TNetHTTPClient vraci IHTTPResponse a to neni string.
Pouzij neco takoveho:
Kód: Delphi [Vybrat]
  1. function GetURLAsString(const aurl: string): string;
  2. var
  3.   lHTTP: TNetHTTPClient;
  4. begin
  5.   lHTTP := TNetHTTPClient.Create(nil);
  6.   try
  7.     Result := lHTTP.Get(aURL).ContentAsString;
  8.   finally
  9.     lHTTP.Free;
  10.   end;
  11. end;

Offline Kony

  • Hrdina
  • ****
  • Příspěvků: 376
  • Karma: 1
    • Verze Delphi: Delphi 7
Re:Delphi a volani API v JSON a jeho uprava
« Odpověď #5 kdy: 22-05-2023, 09:56:56 »
Upraveno,
Kód: Delphi [Vybrat]
  1.    unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  7.   Vcl.Controls, Vcl.Forms, Vcl.Dialogs,System.IOUtils, System.JSON, System.Generics.Collections,
  8.   Vcl.StdCtrls,System.Net.URLClient, System.Net.HttpClient, System.Net.HttpClientComponent;
  9.  
  10. type
  11.   TForm1 = class(TForm)
  12.     Label1: TLabel;
  13.     NetHTTPClient1: TNetHTTPClient;
  14.     procedure FormCreate(Sender: TObject);
  15.   private
  16.     { Private declarations }
  17.     function GetURLAsString(const aURL: string): string;
  18.   public
  19.     { Public declarations }
  20.   end;
  21.  
  22. var
  23.   Form1: TForm1;
  24.   mydata: string;
  25.  
  26. implementation
  27.  
  28. {$R *.dfm}
  29.  
  30. function TForm1.GetURLAsString(const aURL: string): string;
  31. var
  32.   lHTTP: TNetHTTPClient;
  33. begin
  34.   lHTTP := TNetHTTPClient.Create(nil);
  35.   try
  36.     Result := lHTTP.Get(aURL).ContentAsString;
  37.   finally
  38.     lHTTP.Free;
  39.   end;
  40. end;
  41.  
  42. procedure TForm1.FormCreate(Sender: TObject);
  43. var
  44.   V: TJsonValue;
  45.   O, E, P: TJsonObject;
  46.   A: TJsonArray;
  47.   LJsonObj: TJSONObject;
  48.   LJsonValue: TJSONValue;
  49. begin
  50.   mydata := GetURLAsString('https://server_s_API/api/v2/products?codes=AAAAA');
  51.   LJsonObj := TJSONObject.ParseJSONValue(TEncoding.Default.GetBytes(mydata), 0) as TJSONObject;
  52.   try
  53.     LJsonValue := LJsonObj.Get('last').JsonValue;
  54.     Label1.Caption := LJsonValue.Value;
  55.   finally
  56.     LJsonObj.Free;
  57.   end;
  58.  
  59.   V := TJSONObject.ParseJSONValue(mydata);
  60.   if not Assigned(V) then
  61.     raise Exception.Create('Invalid JSON');
  62.   try
  63.     O := V as TJsonObject;
  64.     A := O.GetValue<TJsonArray>('products');
  65.     for var I := 0 to A.Count - 1 do
  66.     begin
  67.       E := A.Items[I] as TJsonObject; // Element
  68.       P := E.GetValue<TJsonObject>('0');
  69.       ShowMessage('Value: ' + P.GetValue<string>('stock'));
  70.     end;
  71.   finally
  72.     V.Free;
  73.   end;
  74. end;
  75.  
  76. end.
  77.  

Ale nezobrazi me to zadny vysledek
« Poslední změna: 22-05-2023, 10:17:03 od Kony »

Offline Jan Fiala

  • Hrdina
  • ****
  • Příspěvků: 442
  • Karma: 6
    • Verze Delphi: 10.4.1
    • PSPad editor
Re:Delphi a volani API v JSON a jeho uprava
« Odpověď #6 kdy: 22-05-2023, 12:12:49 »
To se ale budes muset podivat, co ti to vraci. Nikde netestujes, jestli se ti vraci 200, ze by request v poradku ani nic jineho. Tak si aspon nech vypsat ten vysledny retezec, jestli v nem mas JSON
Pripadne sem vloz JSON, ktery to ma vratit

Na tom serveru neni zadne overovani? To si kdokoliv pristoupi k serveru a bez niceho si muze modifikovat data ve skladu?
« Poslední změna: 22-05-2023, 12:17:22 od Jan Fiala »

Offline Kony

  • Hrdina
  • ****
  • Příspěvků: 376
  • Karma: 1
    • Verze Delphi: Delphi 7
Re:Delphi a volani API v JSON a jeho uprava
« Odpověď #7 kdy: 22-05-2023, 12:19:49 »
je tam overovani, pridavamn pred nazev serveru

Offline Jan Fiala

  • Hrdina
  • ****
  • Příspěvků: 442
  • Karma: 6
    • Verze Delphi: 10.4.1
    • PSPad editor
Re:Delphi a volani API v JSON a jeho uprava
« Odpověď #8 kdy: 24-05-2023, 11:00:08 »
Vraci to nejaky JSON?
Zkousel jsi to v PostMan, aby si overil, ze to vraci, co potrebujes?