Einzelnen Beitrag anzeigen

Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
848 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: CURL in Delphi ausführen -d

  Alt 5. Feb 2025, 21:52
Hallo jaenicke,
vielen Dank für Deine Antwort. Leider war das noch nicht die Lösung. Ich habe es auf pkREQUESTBODY umgestellt und mit und ohne poDoNotEncode getestet...
Ergebnis ist in beiden Fällen ein HTTP/1.1 400 Bad Request

Ich habe jetzt ein bißchen wild durchprobiert, weil mir der logische Ansatz fehlt...

Diese Kombination scheint zu klappen. Es kommt kein Fehler und der Content ist wie erwartet. Aber warum das jetzt funktioniert weiß ich leider nicht

Delphi-Quellcode:
function TForm1.GetDHLAccessToken_Own3(APIKEY, APISecret, UserName, Password: string; var URL: string): string;
var Client : TRESTClient;
      Request : TRESTRequest;
      JsResponse: TJSONValue;
      response: TCustomRESTResponse;
begin
   Client := TRESTClient.Create(nil);
   Request:= TRESTRequest.Create(client);
   Try
      Try
         Client.BaseURL:= 'https://api-sandbox.dhl.com';
         Request.Resource:= 'parcel/de/account/auth/ropc/v1/token';

         Request.Method := rmPOST;

         Request.Params.AddItem('accept', 'application/json', pkHTTPHEADER, [poDoNotEncode]);
         Request.Params.AddItem('content-type', 'application/x-www-form-urlencoded', pkHTTPHEADER, [poDoNotEncode]);

         Request.Params.AddItem('client_id', APIKEY, pkGETorPOST, [poDoNotEncode]);
         Request.Params.AddItem('client_secret', APISecret, pkGETorPOST, [poDoNotEncode]);
         Request.Params.AddItem('username', UserName, pkGETorPOST, [poDoNotEncode]);
         Request.Params.AddItem('password', Password, pkGETorPOST, [poDoNotEncode]);

         Request.AddParameter('grant_type', 'password', pkGETorPOST, [poDoNotEncode]);


         URL:= Request.GetFullRequestURL;
         Request.Execute;
         if request.Response.StatusCode = 200 then begin
            JsResponse:= TJSONObject.ParseJSONValue(request.Response.Content);
            Result:= JsResponse.GetValue<string>('access_token');
         end
         else begin
            ShowMessage(IntToStr(request.Response.StatusCode) + ' ' + request.Response.StatusText);
            Result:= 'Error: ' + IntToStr(request.Response.StatusCode) + ' ' + request.Response.StatusText;
         end;
      Except
         ON e: Exception do begin
            Result:= E.Message;
            ShowMessage('Keine Daten erhalten');
         end;
      end;
   Finally
      Request.Free;
      Client.Free;
   End;
end;
Mit WireShark habe ich schon versucht, komme ich aber nicht zurecht. Es werden einfach zu viele Pakete gleichzeitig protokolliert und ich finde die richtigen nicht, geschweige denn, dass ich etwas richtiges herauslesen kann. Das ist mir erst einmal gelungen...
Patrick
  Mit Zitat antworten Zitat