German [solved] Deutsche Post - Internetmarke

DonManfred

Expert
Licensed User
Longtime User
Hallo Community,
hat von euch jemand erfahrungen mit der Rest-Api der Deutschen Post - Internetmarke

Im Grunde möchte ich nur die erstellung einer Internetbriefmarke automatisieren.
Aber ich scheitere schon daran, einen accesstoken zu generieren über die User-Resource

Ich hab es mit
B4X:
    Dim values As Map
    values.Initialize
    values.Put("grant_type",su.EncodeUrl("client_credentials","UTF-8"))
    values.Put("username",su.EncodeUrl(apiusername,"UTF-8"))
    values.Put("password",su.EncodeUrl(apipassword,"UTF-8"))
    values.Put("client_id",su.EncodeUrl(apikey,"UTF-8"))
    values.Put("client_secret",su.EncodeUrl(apisecret,"UTF-8"))

    Dim j As HttpJob
    j.Initialize("",Me)
    j.PostMultipart("https://api-eu.dhl.com/post/de/shipping/im/v1/user",values,Null)
    j.GetRequest.SetHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")
    'headers.Put("Content-Type", "application/x-www-form-urlencoded")
    J.GetRequest.SetContentEncoding("UTF-8")
    'J.GetRequest.SetContentType("application/x-www-form-urlencoded")
    Wait For (j) JobDone(j As HttpJob)
    If j.Success Then
        Log(j.GetString)
    End If
    j.Release
versucht aber da bekomme ich leider eine Fehlermeldung

ResponseError. Reason: Unsupported Media Type, Response: {"fault":{"faultstring":"Unsupported Encoding \"UTF-8\"","detail":{"errorcode":"protocol.http.UnsupportedEncoding"}}}

Wäre für jede Hilfe dankbar ;-)
 

JanG

Member
Licensed User
Longtime User
Hi Manfred,
ich würde dir gerne helfen. Jedoch finde ich bei der DHL-API-Dokumentation keine Beschreibung, wie ich an einen Usernamen/Passwort komme. Client-ID und Client-Secret sind kein Problem. Aber User? Nicht zu finden. Kannst du mir da helfen?
VG
Jan
 

JanG

Member
Licensed User
Longtime User
Wenn du die Encoding-Angabe weglässt, hast du zumindest die "Unsupported Media Type" Fehlermeldung nicht mehr. Also:
B4X:
J.GetRequest.SetContentEncoding("")

Jedoch klappt es immer noch nicht, da PostMultipart nicht das Gleiche ist wie x-www-form-urlencoded.
 

Alexander Stolte

Expert
Licensed User
Longtime User
Ich glaube Don hat im Englischen Sprachigen Teil das lösen können:
 

DonManfred

Expert
Licensed User
Longtime User
DHL-API-Dokumentation keine Beschreibung, wie ich an einen Usernamen/Passwort komme.
Ich hab das System auch noch nicht ganz verstanden :D

Ich denke aber, dass Username und Passwort mit der Portokasse zusammenhängen. Ich habe auch von der Post einen Test-Account bekommen auf dem 1000,- zum Testen drauf sind (Marken dürfen natürlich nicht eingereicht/benutzt werden).

Portokasse ist hier: https://portokasse.deutschepost.de/portokasse/#!/
Es gab in der Dokumentation auch einen Hinweis auf die Verwendung mit einer Portokasse. Da ist auch wo eine Mail wo Du einen Testaccount anlegen lassen kannst.
 
Last edited:

DonManfred

Expert
Licensed User
Longtime User
da PostMultipart nicht das Gleiche ist wie x-www-form-urlencoded
Kannst Du mir ein Beispiel für einen korrekten x-www-form-urlencoded Aufruf geben der manche Werte übergibt?

Aktuell bekomme ich bei
B4X:
    Dim su As StringUtils

    Dim sb As StringBuilder
    sb.Initialize
    sb.Append("grant_type=client_credentials").Append("&")
    sb.Append(su.EncodeUrl(apiloginSandbox,"UTF8") ).Append("&")
    sb.Append(su.EncodeUrl(apipasswordSandbox,"UTF8")).Append("&")
    sb.Append("client_id=xxxx").Append("&")
    sb.Append("client_secret=yyyy")
    Dim body As String = sb.ToString
    'Dim body As String = su.EncodeUrl(sb.ToString,"UTF8")
    Dim j As HttpJob
    j.Initialize("",Me)
    'j.PostMultipart("https://api-eu.dhl.com/post/de/shipping/im/v1/user",values,Null)
    'j.PostBytes("https://api-eu.dhl.com/post/de/shipping/im/v1/user",data.GetBytes("UTF-8"))
    j.PostString("https://api-eu.dhl.com/post/de/shipping/im/v1/user", body)
    j.GetRequest.SetHeader("content-type", "application/x-www-form-urlencoded")
    j.GetRequest.SetHeader("Content-Length", 0)

    'j.GetRequest.SetHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")
    'headers.Put("Content-Type", "application/x-www-form-urlencoded")
    J.GetRequest.SetContentType("application/x-www-form-urlencoded; charset=UTF-8")
    J.GetRequest.SetContentEncoding("")
    'J.GetRequest.SetContentType("application/x-www-form-urlencoded")
    Wait For (j) JobDone(j As HttpJob)
    If j.Success Then
        Log(j.GetString)
    End If
    j.Release

ResponseError. Reason: Bad Request, Response: {"status":400,"title":"Bad Request","detail":"I need both username and password in the www-form-encoded body."}

Ist also noch nicht ganz richtig irgendwie....
 
Last edited:

JanG

Member
Licensed User
Longtime User
Doch, Dein Code ist korrekt. Ich weiß nicht, was bei Dir in apiloginSandbox und apipasswordSandbox drin steht. Aber folgender Code funktioniert bei mir:
b4x:
    Dim sb As StringBuilder
    
    sb.Initialize
    sb.Append("grant_type=client_credentials").Append("&")
    sb.Append("username=xxx@xxx.de").Append("&")
    sb.Append("password=XXXXXXXXXXXX").Append("&")
    sb.Append("client_id=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX").Append("&")
    sb.Append("client_secret=XXXXXXXXXXXXXXXX")
    Dim body As String = sb.ToString
    
    Dim j As HttpJob
    j.Initialize("",Me)
    j.PostString("https://api-eu.dhl.com/post/de/shipping/im/v1/user", body)
    J.GetRequest.SetContentType("application/x-www-form-urlencoded; charset=UTF-8")

    Wait For (j) JobDone(j As HttpJob)
    If j.Success Then
        Log(j.GetString)
    End If
    j.Release

Zurück bekomme ich:
JSON:
{
    "access_token": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
    "authenticated_user": "xxx@xxx.de",
    "expires_in": 86400,
    "external_customer_id": "xxxxx-0001",
    "infoMessage": "",
    "issued_at": "Sat, 01 Mar 2025 13:45:14 GMT",
    "showTermsAndConditions": true,
    "token_type": "BearerToken",
    "userToken": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
    "walletBalance": 0
}

Ich habe eine Portokasse angelegt. Mit dem User/PW funktioniert dann auch der Login.
 

DonManfred

Expert
Licensed User
Longtime User
Ich habe eine Portokasse angelegt. Mit dem User/PW funktioniert dann auch der Login.
Vielen Dank.
Zumindest bekomme ich nun eine andere Fehlermeldung.

{"status":401,"title":"Unauthorized","detail":"API gateway says: Invalid client identifier {0}"}

Ich habe das Gefühl, das mein ganzer Account (also der wo ich die App angelegt habe und client_id und client_secret hergeholt habe) irgendwie noch freigeschaltet werden muss?
 

JanG

Member
Licensed User
Longtime User
Ja, du solltest eine neue API-App (Internetmarke) anlegen. Am besten die alte löschen. client_id und client_secret würde ich nicht hier veröffentlichen (ist in deinem Code drin).

Mit deinen Daten aus deinem Code bekomme ich die gleiche Fehlermeldung wie du. Mit meiner eigenen selbst angelegten App (client_id/client_secret) klappt es dann. Es wir bei dir daher daran liegen.

Ich hoffe, nun klappt es auch bei dir.

VG
Jan
 

DonManfred

Expert
Licensed User
Longtime User
Mit meiner eigenen selbst angelegten App (client_id/client_secret) klappt es dann. Es wir bei dir daher daran liegen.

Ich hoffe, nun klappt es auch bei dir.
In der Tat. Hab eine neue App angelegt (die alte gelöscht und obige daten somit entfernt.)
Nun ist die app auch Approved und ich bekomme einen AccessToken zurück.

Vielen Dank für deine Hilfe!
 
Top