Seite 1 von 1

Zugriff auf lokale API-Schnittstelle via http.client

Verfasst: Donnerstag 13. August 2020, 19:42
von quelinian
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!

Re: Zugriff auf lokale API-Schnittstelle via http.client

Verfasst: Donnerstag 13. August 2020, 20:23
von Sirius3
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"))

Re: Zugriff auf lokale API-Schnittstelle via http.client

Verfasst: Freitag 14. August 2020, 09:52
von quelinian
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

Re: Zugriff auf lokale API-Schnittstelle via http.client

Verfasst: Freitag 14. August 2020, 10:01
von Sirius3
Das wundert mich jetzt nicht, dass der API-Zugriff irgendeine Art von Autorisierung braucht.

Re: Zugriff auf lokale API-Schnittstelle via http.client

Verfasst: Freitag 14. August 2020, 10:10
von quelinian
Schon klar.
Die API ist ja auch so bei mir auf dem Rechner gestartet bzw. eingerichtet, dass die Autorisierung über den Windows-Benutzer erfolgt.

Re: Zugriff auf lokale API-Schnittstelle via http.client

Verfasst: Freitag 14. August 2020, 10:22
von Sirius3
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.

Re: Zugriff auf lokale API-Schnittstelle via http.client

Verfasst: Freitag 14. August 2020, 10:34
von __deets__
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.

Re: Zugriff auf lokale API-Schnittstelle via http.client

Verfasst: Samstag 15. August 2020, 09:15
von quelinian
__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.

Re: Zugriff auf lokale API-Schnittstelle via http.client

Verfasst: Samstag 15. August 2020, 18:20
von Sirius3
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.