Delphi-PRAXiS
Seite 4 von 4   « Erste     234   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   DHL-API mit RESTClient (https://www.delphipraxis.net/216501-dhl-api-mit-restclient.html)

DeddyH 10. Jan 2025 10:24

AW: DHL-API mit RESTClient
 
Die Demo von TUhr war ein SOAP-Request, der kann ja keine Lösung für ein REST-Problem sein ;-). So wie ich es lese, war der Key seitens DHL noch gar nicht freigeschaltet, dann macht die Fehlermeldung natürlich Sinn.

Ykcim 10. Jan 2025 11:02

AW: DHL-API mit RESTClient
 
Das Beispiel von TUhr ist für meinen nächsten Schritt interessant, wenn ich versuche, über DHL API's Pakete zu versenden.
Aber da ich noch nie mit externen API's gearbeitet habe, wollte ich erst erst einmal die Sendungsverfolgung angehen, die ja viel einfacher ist.

Dabei ist mein Fehler gewesen, dass ich eine API verwendet habe, die nicht freigeschaltet war. Es war eine andere freigeschaltet, aber die ist für unsere Sendungen nicht verwendbar (vielleicht für die internationalen, ich habe es jetzt hier nur mit einer nationalen Sendungsnummer getestet).

Das heißt, dass ich jetzt im nächsten Schritt die funktionierende CURL in eine Delphi-App einbaue und versuchen werden, das ErgebnisJSON zu parsen. und wenn das funktioniert, werde ich mich mit TUhrs Demo an den eigentlichen Schritt wagen, und versuchen Pakete national / international zu versenden.

Aber Dank Eurer Unterstützung habe ich jetzt einen ersten Erfolg mit einer externen API - Vielen Dank!
Patrick

Ykcim 10. Jan 2025 15:44

AW: DHL-API mit RESTClient
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Zusammen,

ich habe das Ganze jetzt in einer kleinen Test-App mal versucht umzusetzen. Sicherlich noch nicht der Weisheit letzter Schluss, aber mal ein Ansatz... Das Ergebnis gebe ich in einem Memo und in einem StringGrid aus.

Delphi-Quellcode:
unit frmMain;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, REST.Types, Vcl.StdCtrls, System.JSON,
  REST.Client, AdvUtil, Vcl.Grids, AdvObj, BaseGrid, AdvGrid, Vcl.ExtCtrls;


type
   TRows = array of array of string; // [Cols, Rows]
   TCols = array of string;
  TForm1 = class(TForm)
    edtTrckngNr: TEdit;
    btnStrt: TButton;
    mmResult: TMemo;
    SG_Result: TAdvStringGrid;
    Panel1: TPanel;
    lblTrckngNr: TLabel;
    edtAPIKEY: TEdit;
    lblAPIKEY: TLabel;
    mmURL: TMemo;
    lblURL: TLabel;
    procedure btnStrtClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


procedure FillAdvGrid(SG: TAdvStringGrid; Cols: TCols; Rows: TRows);
var
  i, j: Integer;
begin
   SG.Filter.Clear;
   SG.FilterActive:=false;
   SG.Clear;
   SG.FloatingFooter.Visible:=false;
   for i := 0 to SG.ColCount -1 do begin
      SG.Cols[i].BeginUpdate;
   end;
   if Assigned(Rows) then begin
      // Wir brauchen eine Zeile mehr für die Spaltenüberschriften
      SG.RowCount := length(Rows[0]) +1;
      SG.ColCount := length(Cols);
      SG.FixedRows := 0;
      // Spaltenüberschriften in die erste Zeile schreiben
      for i := 0 to length(Cols) - 1 do begin
         SG.Cols[i].Add(Cols[i]);
         SG.Cells[i, 0] := Cols[i];
      end;
      // zwei-dimensionales Zeilen-Array in den Zellen ausgeben
      for i := 0 to length(Cols) - 1 do begin
         for j := 0 to length(Rows[0]) - 1 do begin
            SG.Cells[i, j + 1] := Rows[i, j];
         end;
      end;
   end;
   for i := 0 to SG.ColCount -1 do begin
      SG.Cols[i].EndUpdate;
   end;
end;

procedure JSArrayToColsRows(Response: string; ArraySectionPath: string; var Cols: TCols; var Rows: TRows);
var  JSValue: TJSONValue;
      JSObjEvent: TJSONObject;
      JSArryEvents: TJSONArray;
      I, J: integer;
begin
   JSValue:= TJSonObject.ParseJSONValue(Response);
   JSArryEvents:= TJSONArray(JSValue.FindValue(ArraySectionPath));
   for I := 0 to JSArryEvents.Count -1 do begin
      if JSArryEvents.Items[I] is TJSONObject then begin
         JSObjEvent := TJSONObject(JSArryEvents.Items[I]);
         SetLength(Cols, JSObjEvent.Count);
         SetLength(Rows, Length(Cols), I+1);
         for J := 0 to JSObjEvent.Count -1 do begin
            Cols[J]:= JSObjEvent.Pairs[J].JsonString.ToString;
            Rows[J, Length(Rows[0]) -1]:= JSObjEvent.Pairs[J].JsonValue.ToString;
         end;
      end;
   end;
end;

function cUrlCall (TrackNr, APIKEY: string; var URL: string; var Cols: TCols; var Rows: TRows): string;
var  client : TRESTClient;
      request : TRESTRequest;
begin
   client := TRESTClient.Create('https://api-eu.dhl.com');
   try
      try
         request := TRESTRequest.Create(client);
         request.Method := rmGet;
         request.Resource := 'track/shipments';
         request.AddParameter('trackingNumber', TrackNr, pkGETorPOST, []);
         request.AddParameter('language', 'DE', pkGETorPOST, []);
         request.Params.AddItem('DHL-API-Key', APIKEY, pkHTTPHEADER, [poDoNotEncode]);
         URL:= request.GetFullRequestURL;
         request.Execute;
         JSArrayToColsRows(request.Response.Content, 'shipments[0].events', Cols, Rows);

         Result:= request.Response.Content;
      Except
         ON e: Exception do begin
            Result:= E.Message;
            ShowMessage('Keine Daten erhalten');
         end;
      end;
   finally
      client.Free;
   end;
end;

procedure TForm1.btnStrtClick(Sender: TObject);
var  RequestResult: string;
      URL: string;
      Cols: TCols;
      Rows: TRows;
begin
   RequestResult:= cUrlCall(edtTrckngNr.Text, edtAPIKEY.Text, URL, Cols, Rows);
   mmURL.lines.Text:= URL;
   mmResult.Lines.Text:= RequestResult;
   SG_Result.AutoSize:= false;
   FillAdvGrid(SG_Result, Cols, Rows);
   SG_Result.FixedRows:= 1;
   SG_Result.AutoSize:= true;
end;

//In CMD eingeben
// curl https://api-eu.dhl.com/track/shipments?trackingNumber=yyyyyyyyyyyyyyy -H DHL-API-Key:xxxxxxxxxxxxxxxxx -v

end.
Durch den Parameter "language" wird das Ergebnis (remark und z.T. description) auf deutsch ausgegeben.

Ich habe das Projekt mal angehängt, falls es jemand gebrauchen kann.

Vielen Dank und schönes WE
Patrick


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:58 Uhr.
Seite 4 von 4   « Erste     234   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz