Token-Abrufs with application/x-www-form-urlencoded[Gelöst]

9. Juli 2024 14:25

Hallo zusammen,

ich habe eine Frage bezüglich des Token-Abrufs (DHL). Der relevante Link lautet: DHL Authentication API.

Hier ist der Curl-Befehl:
Curl -k -i -X POST -H "accept: application/json"
-H 'content-type: application/x-www-form-urlencoded' https://api-sandbox.dhl.com/parcel/de/a ... c/v1/token
-d "grant_type=password&username=max.mustermann&password=MeinPasswort123#&client_id=lr8wTCJjcNnNL9HVYxQYTO6NGqlcGIGg&client_secret=hz0ofecvbAaEJxWF"

In der Postman App hat es funktioniert, aber in NAV funktioniert es nicht. Hier ist der Code. Kann mir jemand helfen?

URL := 'https://api-eu.dhl.com/parcel/de/account/auth/ropc/v1/token';
TextBody := 'grant_type=password&username=admin&password=xxxxx&client_id=xxxxxxxxxxxxx&client_secret=xxxxxxxxxx';
HttpWebRequestMgt.Initialize(URL);
HttpWebRequestMgt.SetMethod('POST');
HttpWebRequestMgt.SetReturnType('APPLICATION/JSON');
HttpWebRequestMgt.SetContentType('application/x-www-form-urlencoded');
HttpWebRequestMgt.AddBodyAsText(TextBody);
CLEAR(TempBlob);
HttpWebRequestMgt.SendRequestAndReadResponse(TempBlob, ErrorText, ErrorDetailsText, HttpStatusCode, ResponseHeaders);
CLEAR(TextBody);
CLEAR(JSONBufferHeader);
JSONBufferHeader.ReadFromBlob(TempBlob);
JSONBufferHeader.SETRANGE("Token type", JSONBufferHeader."Token type"::String);
IF JSONBufferHeader.FINDSET() THEN BEGIN
REPEAT
IF TextBody <> '' THEN
TextBody += CRFL;
TextBody += STRSUBSTNO('%1 = %2', JSONBufferHeader.Path, JSONBufferHeader.Value);
UNTIL JSONBufferHeader.NEXT() = 0;
END;
MESSAGE(TextBody);


Der Message ist

Microsoft Dynamics 365 Business Central
---------------------------

title = Bad Request
detail = Unsupported grant type: Only password and refresh_token are supported.

---------------------------
OK
---------------------------

Vielen Dank im Voraus für eure Hilfe!
Zuletzt geändert von Ali_Salham am 11. Juli 2024 11:08, insgesamt 1-mal geändert.

Re: Token-Abrufs with application/x-www-form-urlencoded

9. Juli 2024 18:27

Hallo,
ich hab hier kein NAV 2018, allerdings musste ich bei mir das Encoding von UTF8 auf ASCII stellen.
Das wird hier unter "HttpWebRequestMgt.AddBodyAsText" gesetzt.

Vielleicht hilft dir das schon weiter.

Re: Token-Abrufs with application/x-www-form-urlencoded

10. Juli 2024 11:46

Hallo Furean,

Danke für deinen Tipp,
Ich habe es mit dem folgenden Code versucht, aber ich erhalte die gleiche Antwort.

TextBody := 'grant_type=password&username=admin&password=xxxxxx&client_id=xxxxxxxxx&client_secret=xxxxx';
HttpWebRequestMgt.AddBodyAsAsciiText(TextBody);


title = Bad Request
detail = Unsupported grant type: Only password and refresh_token are supported.

Re: Token-Abrufs with application/x-www-form-urlencoded

10. Juli 2024 15:41

Okay, ich habe eigentlich nur die eine Stelle angepasst. Beispiel anbei:

Code:
url := 'https://api-eu.dhl.com/parcel/de/account/auth/ropc/v1/token';
TextBody := 'grant_type=password&username=admin&password=xxxxx&client_id=xxxxxxxxxxxxx&client_secret=xxxxxxxxxx';
HttpWebRequestMgt.Initialize(URL);
HttpWebRequestMgt.SetMethod('POST');
HttpWebRequestMgt.SetReturnType('application/json');
HttpWebRequestMgt.SetContentType('application/x-www-form-urlencoded');
HttpWebRequestMgt.AddBodyAsAsciiText(TextBody);
TempBlob.Blob.CREATEINSTREAM(inStream);
IF NOT HttpWebRequestMgt.GetResponse(inStream,HttpStatusCode,ResponseHeaders) THEN
  HttpWebRequestMgt.ProcessFaultResponse(Response);

Re: Token-Abrufs with application/x-www-form-urlencoded

11. Juli 2024 11:07

Hallo Furean

Herzlichen Dank für deine Unterstützung. Ich fand die Lösung. hier ist den Code C/AL und C#.


Name DataType Subtype Length
FormUrlEncodedContent DotNet System.Net.Http.FormUrlEncodedContent.'System.Net.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
HttpResponseMessage DotNet System.Net.Http.HttpResponseMessage.'System.Net.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
HttpContent DotNet System.Net.Http.HttpContent.'System.Net.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
HttpWebRequestMgt Codeunit Http Web Request Mgt.
MediaTypeWithQualityHeaderValue DotNet System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.'System.Net.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
Type DotNet System.Type.'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
Arr DotNet System.Array.'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
Dictionary DotNet System.Collections.Generic.Dictionary`2.'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
String DotNet System.String.'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
Activator DotNet System.Activator.'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
JSONTextReader DotNet Newtonsoft.Json.JsonTextReader.'Newtonsoft.Json'
StringReader DotNet System.IO.StringReader.'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
Text_Body Text



Code:
LOCAL [TryFunction] GetAuthToken2()
URL := 'https://api-eu.dhl.com/parcel/de/account/auth/ropc/v1/token';

HttpClient := HttpClient.HttpClient();
MediaTypeWithQualityHeaderValue := MediaTypeWithQualityHeaderValue.MediaTypeWithQualityHeaderValue('application/x-www-form-urlencoded');
HttpClient.DefaultRequestHeaders.Accept.Add(MediaTypeWithQualityHeaderValue);

Arr := Arr.CreateInstance(GETDOTNETTYPE(Type),2);
Arr.SetValue(GETDOTNETTYPE(String),0);
Arr.SetValue(GETDOTNETTYPE(String),1);

Type := GETDOTNETTYPE(Dictionary);
Type := Type.MakeGenericType(Arr);

Dictionary := Activator.CreateInstance(Type);
Dictionary.Add('grant_type','password');
Dictionary.Add('client_id','XXXXXXX');
Dictionary.Add('username','XXXXXXX');
Dictionary.Add('password','XXXXXXX');
Dictionary.Add('client_secret','XXXXXXX');

FormUrlEncodedContent := FormUrlEncodedContent.FormUrlEncodedContent(Dictionary);
HttpResponseMessage := HttpClient.PostAsync('https://api-eu.dhl.com/parcel/de/account/auth/ropc/v1/token',FormUrlEncodedContent).Result;
HttpResponseMessage.EnsureSuccessStatusCode();
Text_Body := FORMAT(HttpResponseMessage.Content.ReadAsStringAsync().Result);


JSONTextReader := JSONTextReader.JsonTextReader(StringReader.StringReader(Text_Body));
IF JSONTextReader.Read THEN BEGIN
  REPEAT
    IF TextBody <> '' THEN
      TextBody += CRFL;
    TextBody += STRSUBSTNO('%1 = %2 / %3',JSONTextReader.Path,JSONTextReader.Value,JSONTextReader.TokenType);
  UNTIL NOT JSONTextReader.Read;
END;
MESSAGE(TextBody);



Code:
string url = "https://api-eu.dhl.com/parcel/de/account/auth/ropc/v1/token";
var httpClient = new HttpClient();

// Formulate the content data
var content = new FormUrlEncodedContent(new[]
{
        new KeyValuePair<string, string>("grant_type", "XXXXXX"),
        new KeyValuePair<string, string>("client_id", "XXXXXX"),
        new KeyValuePair<string, string>("username", "XXXXXX"),
        new KeyValuePair<string, string>("password", "XXXXXX"),
        new KeyValuePair<string, string>("client_secret", "XXXXXX")
    });

// Send the POST request
var response = await httpClient.PostAsync(url, content);

// Check if the request was successful
if (response.IsSuccessStatusCode)
{
    // Read and display the response from the API
    var responseContent = await response.Content.ReadAsStringAsync();
    Console.WriteLine(responseContent);
}
else
{
    Console.WriteLine("Failed to retrieve access token.");
}