22.01.2020 21:58 - bearbeitet 22.01.2020 22:11
Hallo liebe API-Tüftler,
ich versuche mich gerade daran mittels Python und dem Modul 'requests' meine Umsätze abzurufen und anschließend 'Data science' zu betreiben (mein Nutzername verrät schon womit).
Kommunikation mit der API, abrufen des Access-Tokens, abrufen der TAN-challenge etc. funktioniert problemlos, allerdings will mich die API beim besten Willen nicht reinlassen. Ich bekomme, egal ob die TAN korrekt oder absichtlich falsch ist, den Fehlercode 415.
Es geht dabei um den Punkt 2.4 in der API-Dokumentation.
Die Antwort der API sieht wie folgt aus:
{"code":"request.object.invalid",
"messages":[{"severity":"ERROR",
"key":"UNPROCESSABLE_ONCE_AUTHENTICATION_INFO_HEADER",
"message":null,
"args":{},
"origin":[]}]}Es liegt also an dem von mir konstruiertem once-authentication-info-header.
Der gesamte Header wie er in Pythons requests-Object zufinden ist: (zensiert natürlich)
{'User-Agent': 'python-requests/2.22.0',
'Accept-Encoding': 'gzip, deflate',
'Accept': 'application/json',
'Connection': 'keep-alive',
'Content-Type': 'application/json',
'x-http-request-info': "{'clientRequestId': {'sessionId': '11aa22bb33cc44dd55ee66ff11aa22bb', 'requestId': '12345678'}}",
'Authorization': 'Bearer 1a2b3c4d-5e6f-1a2b-3c4d-5e6f1a2b3c4d',
'x-once-authentication-info': "{'id': '12345678'}",
'x-once-authentication': '123456',
'Content-Length': '98'}und der body:
{"identifier": "11aa22bb33cc44dd55ee66ff11aa22bb",
"sessionTanActive": true,
"activated2FA": true}
Ich kann allerdings keine Diskrepanzen meines Headers und dem in der Doku definiertem finden (oder ich bin betriebsblind geworden).
Habe das ganze auch schonmal in Postman versucht und da funktioniert der Request dann ohne Probleme.
Wenn einer von euch mir da helfen kann oder sich vielleicht sogar mit dem requests-Modul in Pyhton auskennt, wäre mir schon sehr geholfen.
Grüße
pandas
Edit: Lesbarkeit des Codes verbessert
Gelöst! Gzum hilfreichen Beitrag.
23.01.2020 13:08 - bearbeitet 23.01.2020 15:17
Hallo @pandas,
herzlich willkommen in unserer Community! 🙂
Deine Header 'x-http-request-info' und 'x-once-authentication-info' weisen einen kleinen Unterschied zu denen aus der Doku auf.
Bitte nimm die Anführungszeichen vor den geschweiften Klammern weg. Dann sollte das passen und deine beiden Header der Dokumentation auf Seite 11 entsprechen, also:
'x-http-request-info': '{"clientRequestId":{"sessionId":"11aa22bb33cc44dd55ee66ff11aa22bb","requestId":"12345678"}}',
'x-once-authentication-info': '{"id": "12345678"}',
Solltest du unsere Postman-Collection nutzen, kannst du in der oberen Taskleiste auf der rechten Seite auf "Code" klicken und anschließend die gewünschte Programmiersprache (in diesem Fall Python) auswählen. Im Anschluss generiert Postman den Request als Codeschnipsel in der gewünschten Programmiersprache.
Beste Grüße
Jan-Ove
am 23.01.2020 18:36
Hallo @SMT_Jan-Ove ,
vielen Dank für die zügige Antwort.
Ganz so leicht ist die Lösung des Problems leider nicht.
Da das requests-Modul die Header in der Form {'key':'value'} verlangt, muss somit ein geschachteltes Dict in einen String gecastet werden:
requests.exceptions.InvalidHeader:
Value for header {x-http-request-info: {'clientRequestId': {'sessionId': '11aa22bb33cc44dd55ee66ff11aa22bb', 'requestId': '12345678'}}}
must be of type str or bytes, not <class 'dict'>
Ich hab nun mal, wie vorgeschlagen den Code aus Postman kopiert mit dem Format wie dort angegeben, funktioniert der Request.
Ich habe dann schlussendlich auch zur Lösung des Problems gefunden:
Es war in der Tat die Konstruktion der einzelnen Header.
Mein Fehler war ein (wie oben beschrieben) ein Dict in einen String zu casten.
Besser ist es wenn man bereits als 'Value' einen String verwendet und diesen mit der Stringformat-Methode konstruiert:
{'x-once-authentication-info': '{{\"id\": \"{tan_id}\"}}'.format(tan_id=tan_challange['id'])}Dabei ist folgendes (sehr wichtiges) zu beachten:
Das Dictionary charakterisiert sich durch einschließende geschweifte Klammern. Dummerweise genau so die die Keywords auf die '.format()' reagiert!
Es ist hier also wichtig die Klammern für das Dictionary zu escapen. Also mit doppelten Klammern '{{' der format-Funktion klarmachen das dies kein Keyword enthält...
Uff... was eine hinterhältige Feinheit.
Danke für deine Hilfe und schöne Grüße
pandas
am 25.01.2020 11:51 - zuletzt bearbeitet am 27.01.2020 08:34 von ehemaliger Nutzer
am 25.01.2020 11:51 - zuletzt bearbeitet am 27.01.2020 08:34 von ehemaliger Nutzer
Edit: Werbung entfernt