Zugriff auf lokale API-Schnittstelle via http.client

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
quelinian
User
Beiträge: 4
Registriert: Donnerstag 13. August 2020, 19:27

Liebe Kollegen,

vorab zur Info: Ich versuche folgenden Code auf Windows 10 via "Parallels Desktop 16 for Mac" auszuführen. Ich habe es bereits mit einem Host-exklusiven, sowie einem gemeinsam Netzwerk versucht.

Ich versuche mit Python auf eine API-Schnittstelle (lokal installierte Software (DATEV) und Datenbank) im lokalen Netzwerk zuzugreifen. Der Python-Code wurde vom Hersteller der Software vorgegeben:

Code: Alles auswählen

import http.client
conn = http.client.HTTPConnection("localhost:58454")
headers = { 'accept': "application/json;charset=utf-8" }
conn.request("GET", "/datev/api/accounting/v1/clients", headers=headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
Wenn ich "http://localhost:58454/datev/api/accounting/v1/clients" im Chrome-Browser eingebe, bekomme ich auch ein Ergebnis (XML-Version der Daten, die in der Datenbank gespeichert werden); also scheint zumindest die API-Schnittstelle zu funktionieren.

Wenn ich den Python-Code ausführe (ich verwende die Standard Python IDLE), passiert gar nichts. Keine Fehlermeldung, nichts. Lediglich ">>>".

Was fehlt in diesem o. s. Code? Zwar wurde er vom Hersteller so vorgegeben, allerdings scheint noch irgendwas zu fehlen.

Danke für eure Hilfe!
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn Du auf `localhost` zugreifst, ist die Anbindung ans Netzwerk völlig egal.
Wie führst Du den Code denn aus? Denn irgendetwas außer >>> sollte schon passieren.

Ich glaube, niemand benutzt http.client, weil selbst die Standardbibliothek mit urllib.request schon was besseres mitbringt.

Code: Alles auswählen

import urllib.request
headers = { 'accept': "application/json;charset=utf-8" }
request = urllib.request.Request("http://localhost:58454/datev/api/accounting/v1/clients", headers=headers)
response = urllib.request.urlopen(req)
data = response.read()
print(data.decode("utf-8"))
quelinian
User
Beiträge: 4
Registriert: Donnerstag 13. August 2020, 19:27

Hier ist der ursprüngliche Code. Wie man sieht, sieht man nichts. Naja, zumindest gibt es noch eine Leerzeile vor ">>>".

Bild


Warum für den API-Zugriff http.client benutzt wird, ist mir auch ein Rätsel. Jedenfalls, wenn ich deinen Code verwende, dann bekomme ich einen 401-Fehler. Es scheint auch wirklich total egal zu sein, wie ich die Netzwerkeinstellungen einstelle, wobei es aber irgendwie doch an Parallels liegen muss...

Bild
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Das wundert mich jetzt nicht, dass der API-Zugriff irgendeine Art von Autorisierung braucht.
quelinian
User
Beiträge: 4
Registriert: Donnerstag 13. August 2020, 19:27

Schon klar.
Die API ist ja auch so bei mir auf dem Rechner gestartet bzw. eingerichtet, dass die Autorisierung über den Windows-Benutzer erfolgt.
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Ich kenne die Schnittstelle nicht, aber die Meldung sagt, dass Du die HTTP-Anfrage autorisieren mußt. Damit ist auch klar, warum Du bei Deinem ersten Code nur einen leeren Body als Antwort bekommst.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wie stellt man denn ein, das eine API lokal authorisiert ist vom Windows User? Ich kenne oauth für Single sign on zb bei uns in der Firma. Aber das muss dann trotzdem von jedem HTTP-Client durchgezogen werden.
quelinian
User
Beiträge: 4
Registriert: Donnerstag 13. August 2020, 19:27

__deets__ hat geschrieben: Freitag 14. August 2020, 10:34 Wie stellt man denn ein, das eine API lokal authorisiert ist vom Windows User? Ich kenne oauth für Single sign on zb bei uns in der Firma. Aber das muss dann trotzdem von jedem HTTP-Client durchgezogen werden.
Ganz einfach. Ich kann in der Software den Zugriff auf die API freigeben und dort festlegen, wie die Autorisierung erfolgen soll; wobei auf dem selben PC ohnehin nur die Windows-Autorisierung möglich ist, aber genau das funktioniert nicht.
Bin jetzt auch mit Parallels in Klärung, wie denn der Windows-Benutzer und das Passwort ist, wenn ich Windows auf dem Mac starte. Die Anmeldung erfolgt ja hier automatisch und eigentlich ohne Passwort.
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Du must halt mal schauen, was in headers steht und was da an Autorisierungsmethode erwartet wird, und dann kannst Du noch im Browser schauen, wie der sich autentifiziert.
Antworten