Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

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)

Ykcim 8. Jan 2025 11:06

DHL-API mit RESTClient
 
Hallo Zusammen,
wir benötigen eine Möglichkeit, DHL-Labels via Software zu erstellen. Das ist für mich komplettes Neuland daher versuche ich im ersten Schritt, die Sendungsverfolgung über die API zu realisieren.

Ich habe mich registriert, die App hinzugefügt und habe meinen API-Key.

In der Dokumentation steht folgende CURL als Beispiel:
Zitat:

curl -X GET 'https://api-eu.dhl.com/track/shipments?trackingNumber=7777777770' -H 'DHL-API-Key: PasteHere_ConsumerKey'
Nach langem Suchen und Lesen habe ich folgenden gefundenen Code angepasst und versucht auszuführen:
Delphi-Quellcode:
function cUrlCall: string;
begin
  var client := TRESTClient.Create('https://api-eu.dhl.com');
  try
    var request := TRESTRequest.Create(client);
    request.Method := rmGET;
    request.Resource := 'track/shipments';
    request.AddParameter('trackingNumber', '00341434296527125347', pkGETorPOST, []);
    request.AddAuthParameter('DHL-API-Key','XXxxXXXxxxXXXxxx',pkGETorPOST,[poDoNotEncode]);
    request.Execute;
    Result:= request.GetFullRequestURL;
    Result := Result + ' // Result:' + request.Response.Content;
  finally
    client.Free;
  end;
end;
Das Ergebnis ist eine Fehlermeldung, dass die Authorization fehlgeschlagen ist.

Zitat:

https://api-eu.dhl.com/track/shipmen...xxXXXxxxXXXxxx // Result:{"status":401,"title":"Unauthorized","detai l":"Unauthorized for given resource."}
(TrackingNr und DHL-API-Key sind für die Frage gefakt)

Ich habe das gleiche Problem auch, wenn ich versuche, dass Ganze mit dem RESTDebugger auszuführen.

Kann mir jemand sagen, was ich falsch mache?

Vielen Dank Patrick

DeddyH 8. Jan 2025 11:28

AW: DHL-API mit RESTClient
 
Auf den ersten Blick denke ich, dass der AuthParameter falsch definiert ist. Versuch es doch mal mit pkHTTPHEADER statt pkGETorPOST.

dummzeuch 8. Jan 2025 11:31

AW: DHL-API mit RESTClient
 
Funktioniert es denn mit denselben Parametern mit curl?

Ykcim 8. Jan 2025 11:49

AW: DHL-API mit RESTClient
 
Hallo Zusammen,

vielen Dank für Eure Antworten!
Zitat:

Versuch es doch mal mit pkHTTPHEADER statt pkGETorPOST.
Das hatte ich zwischenzeitlich bereits versucht, aber leider ohne Erfolg! Was mich gewundert hatte, dass der Request mir den API-Key dann nicht mehr anzeigt...

Code:
request.GetFullRequestURL: https://api-eu.dhl.com/track/shipments?trackingNumber=00341434296527125347 
request.Response.Content: {"status":401,"title":"Unauthorized","detail":"Unauthorized for given resource."}

Zitat:

Funktioniert es denn mit denselben Parametern mit curl?
Das ist eine gute Frage, die ich leider noch nicht beantworten kann.
Ich habe noch nie mit CURL gearbeitet. Habe es mir heruntergeladen, weiß aber nicht, wie ich es anwenden muss, damit ich den Zugang prüfen kann...

Wenn ich den String in CMD eingebe bekomme ich folgende Fehlermeldung:
Code:
U:\>curl -X GET 'https://api-eu.dhl.com/track/shipments?trackingNumber=00341434296527125347' -H 'DHL-API-Key:xxXXXxxXXXXXxxXX'
curl: (3) URL rejected: Port number was not a decimal number between 0 and 65535

Rollo62 8. Jan 2025 12:02

AW: DHL-API mit RESTClient
 
Geht es denn auf dem Development Server?
Zitat:

servers:
- url: https://api-test.dhl.com/track
description: Development server
- url: https://api-eu.dhl.com/track
description: Production server

Kas Ob. 8. Jan 2025 12:02

AW: DHL-API mit RESTClient
 
Hi,

Zitat:

Zitat von Ykcim (Beitrag 1544926)
Zitat:

curl -X GET 'https://api-eu.dhl.com/track/shipments?trackingNumber=7777777770' -H 'DHL-API-Key: PasteHere_ConsumerKey'
Nach langem Suchen und Lesen habe ich folgenden gefundenen Code angepasst und versucht auszuführen:
Delphi-Quellcode:
function cUrlCall: string;
begin
  var client := TRESTClient.Create('https://api-eu.dhl.com');
  try
    var request := TRESTRequest.Create(client);
    request.Method := rmGET;
    request.Resource := 'track/shipments';
    request.AddParameter('trackingNumber', '00341434296527125347', pkGETorPOST, []);
    request.AddAuthParameter('DHL-API-Key','XXxxXXXxxxXXXxxx',pkGETorPOST,[poDoNotEncode]);
    request.Execute;
    Result:= request.GetFullRequestURL;
    Result := Result + ' // Result:' + request.Response.Content;
  finally
    client.Free;
  end;
end;

1) Using AddAuthParameter is wrong, From CURL line (-H) it is clearly the "DHL-API-Key: PasteHere_ConsumerKey" should be a header, not a parameter, simple HTTP header.
2) Also you mentioned CURL reporting port is wrong !, then you did copy the link with spaces or something, or you used "'", fix those, and curl will work also
3) Stick to only GET as documented.

here
Code:
curl -X GET https://api-eu.dhl.com/track/shipments?trackingNumber=00341434296527125347 -H DHL-API-Key:xxXXXxxXXXXXxxXX -v
result with
Code:
C:\Users\Kas>curl -X GET https://api-eu.dhl.com/track/shipments?trackingNumber=00341434296527125347 -H DHL-API-Key:xxXXXxxXXXXXxxXX -v
* timeout on name lookup is not supported
* Hostname was NOT found in DNS cache
*   Trying 34.89.220.138...
* Connected to api-eu.dhl.com (34.89.220.138) port 443 (#0)
* successfully set certificate verify locations:
*   CAfile: D:\Program Files\OpenSSL-Win64\bin\curl-ca-bundle.crt
  CApath: none
* SSLv3, TLS handshake, Client hello (1):
* SSLv3, TLS handshake, Server hello (2):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS handshake, Server key exchange (12):
* SSLv3, TLS handshake, Server finished (14):
* SSLv3, TLS handshake, Client key exchange (16):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSL connection using TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384
* Server certificate:
*        subject: C=DE; ST=Nordrhein-Westfalen; L=Bonn; O=Deutsche Post AG; CN=api.dhl.com
*        start date: 2024-04-02 06:41:20 GMT
*        expire date: 2025-04-02 06:40:20 GMT
*        subjectAltName: api-eu.dhl.com matched
*        issuer: C=DE; O=Deutsche Post AG; CN=DPDHL Global TLS CA - I5
*        SSL certificate verify ok.
> GET /track/shipments?trackingNumber=00341434296527125347 HTTP/1.1
> User-Agent: curl/7.39.0
> Host: api-eu.dhl.com
> Accept: */*
> DHL-API-Key:xxXXXxxXXXXXxxXX
>
< HTTP/1.1 401 Unauthorized
< Date: Wed, 08 Jan 2025 10:57:08 GMT
< Content-Type: application/problem+json
< Content-Length: 81
< Connection: keep-alive
< correlation-id: d3533fc5-376b-41f3-b1ff-5e6eb20a37a3
< content-language: en
< Access-Control-Allow-Origin: https://developer.dhl.com
< Vary: Origin
< Access-Control-Allow-Methods: GET,OPTIONS
< Access-Control-Max-Age: 3628800
< Access-Control-Allow-Headers: Accept-Encoding,Accept-Language,Accept,Authorization,Cache-Control,Content-Language,Content-Length,Content-Type,Correlation-Id,DHL-API-Key,Expires,Host,Last-Modified,Origin,Pragma,Referer,User-Agent,X-Forwarded-For,X-Forwarded-Port,X-Forwarded-Proto,X-Requested-With
< Access-Control-Expose-Headers: Cache-Control,Content-Encoding,Content-Language,Content-Length,Content-Type,Correlation-Id,Expires,Last-Modified,Pragma,Referrer-Policy,Strict-Transport-Security,Vary,X-Content-Type-Options,X-DNS-Prefetch-Control,X-Frame-Options,X-XSS-Protection
< Strict-Transport-Security: max-age=63113904; includeSubDomains; preload
< Expires: Sun, 19 Nov 1978 05:00:00 GMT
< Cache-Control: must-revalidate, no-cache, private
< X-XSS-Protection: 1; mode=block
< Content-Security-Policy: default-src 'self'; script-src 'self'
< X-Content-Type-Options: nosniff
<
{"status":401,"title":"Unauthorized","detail":"Unauthorized for given resource."}* Connection #0 to host api-eu.dhl.com left intact

Ykcim 8. Jan 2025 12:24

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

danke für die Unterstützung!

Ich habe es jetzt auf verschiedene Arten gestestet und bekomme immer die Fehlermeldung mit der Autorisierung...

Code:
U:\>curl https://api-eu.dhl.com/track/shipments?trackingNumber=00341434296527125347 -H DHL-API-Key:xxXXXxxXXXXXxxXX -v
* Host api-eu.dhl.com:443 was resolved.
* IPv6: (none)
* IPv4: 34.89.220.138
*   Trying 34.89.220.138:443...
* Connected to api-eu.dhl.com (34.89.220.138) port 443
* schannel: disabled automatic use of client certificate
* ALPN: curl offers http/1.1
* ALPN: server accepted http/1.1
* using HTTP/1.x
> GET /track/shipments?trackingNumber=00341434296527125347 HTTP/1.1
> Host: api-eu.dhl.com
> User-Agent: curl/8.9.1
> Accept: */*
> DHL-API-Key:xxXXXxxXXXXXxxXX
>
* Request completely sent off
< HTTP/1.1 401 Unauthorized
< Date: Wed, 08 Jan 2025 11:15:35 GMT
< Content-Type: application/problem+json
< Content-Length: 81
< Connection: keep-alive
< correlation-id: 9bc53d30-9a80-476a-8ea9-0696a0e8436b
< content-language: en
< Access-Control-Allow-Origin: https://developer.dhl.com
< Vary: Origin
< Access-Control-Allow-Methods: GET,OPTIONS
< Access-Control-Max-Age: 3628800
< Access-Control-Allow-Headers: Accept-Encoding,Accept-Language,Accept,Authorization,Cache-Control,Content-Language,Content-Length,Content-Type,Correlation-Id,DHL-API-Key,Expires,Host,Last-Modified,Origin,Pragma,Referer,User-Agent,X-Forwarded-For,X-Forwarded-Port,X-Forwarded-Proto,X-Requested-With
< Access-Control-Expose-Headers: Cache-Control,Content-Encoding,Content-Language,Content-Length,Content-Type,Correlation-Id,Expires,Last-Modified,Pragma,Referrer-Policy,Strict-Transport-Security,Vary,X-Content-Type-Options,X-DNS-Prefetch-Control,X-Frame-Options,X-XSS-Protection
< Strict-Transport-Security: max-age=63113904; includeSubDomains; preload
< Expires: Sun, 19 Nov 1978 05:00:00 GMT
< Cache-Control: must-revalidate, no-cache, private
< X-XSS-Protection: 1; mode=block
< Content-Security-Policy: default-src 'self'; script-src 'self'
< X-Content-Type-Options: nosniff
<
{"status":401,"title":"Unauthorized","detail":"Unauthorized for given resource."}* Connection #0 to host api-eu.dhl.com left intact
Ich fürchte, dass es ein Problem mit unseren DHL-Berechtigungen gibt. Allerdings steht unter MyApps, dass die App approved und aktiviert ist...

DeddyH 8. Jan 2025 12:27

AW: DHL-API mit RESTClient
 
Bist Du sicher, dass Du das API-Secret nicht auch mit übergeben musst (klassischerweise ebenfalls als Header, möglicherweise mit einem vorangestellten "Bearer ")?

Ykcim 8. Jan 2025 12:35

AW: DHL-API mit RESTClient
 
Nein, dass weiß ich nicht.

Aber wie würde ich bei meiner Function einen Header eingeben? Ich habe es jetzt so versucht:

Delphi-Quellcode:
function cUrlCall: string;
var  client : TRESTClient;
      request : TRESTRequest;
begin
   client := TRESTClient.Create('https://api-eu.dhl.com');
   try
      client.SetHTTPHeader('DHL-API-Key','xxXXXxxXXXXXxxXX');
      request := TRESTRequest.Create(client);
      request.Method := rmGet;
      request.Resource := 'track/shipments';
      request.AddParameter('trackingNumber', '00341434296527125347', pkGETorPOST, []);
      request.Execute;
      Result:= request.GetFullRequestURL;
      Result := Result + ' // Result:' + request.Response.Content;
   finally
      client.Free;
   end;
end;
Leider bekomme ich nach wie vor das Ergebnis:
Code:
Result:{"status":401,"title":"Unauthorized","detail":"Unauthorized for given resource."}

Kas Ob. 8. Jan 2025 12:50

AW: DHL-API mit RESTClient
 
Zitat:

Zitat von Ykcim (Beitrag 1544939)
Nein, dass weiß ich nicht.

Aber wie würde ich bei meiner Function einen Header eingeben? Ich habe es jetzt so versucht:

Delphi-Quellcode:
function cUrlCall: string;
var  client : TRESTClient;
      request : TRESTRequest;
begin
   client := TRESTClient.Create('https://api-eu.dhl.com');
   try
      client.SetHTTPHeader('DHL-API-Key','xxXXXxxXXXXXxxXX');
      request := TRESTRequest.Create(client);
      request.Method := rmGet;
      request.Resource := 'track/shipments';
      request.AddParameter('trackingNumber', '00341434296527125347', pkGETorPOST, []);
      request.Execute;
      Result:= request.GetFullRequestURL;
      Result := Result + ' // Result:' + request.Response.Content;
   finally
      client.Free;
   end;
end;
Leider bekomme ich nach wie vor das Ergebnis:
Code:
Result:{"status":401,"title":"Unauthorized","detail":"Unauthorized for given resource."}

From DHL documentation i see these :
https://developer.dhl.com/api-refere...de--get-access
https://developer.dhl.com/api-refere...e-docs-section

So the question is did you replaced xxXXXxxXXXXXxxXX with your actual key ?
Try that with curl and don't post your key here.
just try with curl until it does work, also you might want to switch to the DHL test server
https://developer.dhl.com/api-refere...e-docs-section


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:52 Uhr.
Seite 1 von 4  1 23     Letzte »    

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