JSON Requests in Python

Veröffentlicht von Philipp - 8. Januar 2020

Mit JSON Requests lässt sich einiges anstellen. Das wahrscheinlich interessanteste, nämlich die Abfrage von Daten und was dabei beachtet werden muss, soll in diesem Artikel kurz erklärt werden. Wer beim programmieren auf Daten angewiesen ist, wird früher oder später schon einmal über JSON gestolpert sein.

Titelbild-Postrequests-in-Python-1050x700

Die JavaScript Object Notation (JSON) hat an sich nicht viel mit JavaScript zu tun, sondern beschreibt lediglich ein kompaktes und gut lesbares Datenformat. Aufgebaut ist eine JSON Datei im Grunde wie ein Python Dictionary. Die Daten können beliebig verschachtelt werden, JSON Elemente können also auch Listen oder weitere JSON Objekte beinhalten.

{
  "Herausgeber": "Xema",
  	"Nummer": "1234-5678-9012-3456",
  	"Deckung": 2e+6,
  	"Waehrung": "EURO",
  	"Inhaber":
  	{
    		"Name": "Mustermann",
    		"Vorname": "Max",
    		"maennlich": true,
    		"Hobbys": ["Reiten", "Golfen", "Lesen"],
    		"Alter": 42,
    		"Kinder": [],
    		"Partner": null
  	}
}

  Der Get Request Der Austausch von JSON Dateien zwischen Serverschnittstellen und dem Client gestaltet sich, in Python, dank einfach zu bedienender Packages, recht simpel. Wir verwenden dafür das requests Package.

import requests

Um den Umgang mit dem requests Package kennen zu lernen, bieten sich Dummy APIs an, die man zum testen ansteuern kann. Eine solche Dummy API ist zum Beispiel reqres, zu finden unter https://reqres.in. Hier der Code um eine erste Abfrage von einer reqres API zu machen:

host = "https://reqres.in"

try:
   
    
    #get content
    response_get = requests.get(host + "/api/users/2")
    content = response_get.json()
    
    print(content)
    
    response_get.raise_for_status()    
    
    #from specific to more general errors
except requests.exceptions.HTTPError as errh:
    print ("Http Error:",errh)
except requests.exceptions.ConnectionError as errc:
    print ("Error Connecting:",errc)
except requests.exceptions.Timeout as errt:
    print ("Timeout Error:",errt)

Die Requests packen wir generell immer in einen try Block. Zum einen, da es vom Server abhängen kann, ob der Code terminiert. Zum anderen, da wir durch die Fehlermeldungen der except Blöcke genauer beobachten können wo genau es hängt, falls etwas schief geht. Die except Blöcke für potentielle Fehler baut man in der Regel so, dass spezifische Fehler zuerst berücksichtigt werden können und folgende Blöcke zunehmend umfassendere Fehler überprüfen. Die Anfrage selbst ist simpel, wir starten mit einem einfachen get Request. Hierfür müssen wir lediglich die URL der API angeben und diese gibt uns zurück was immer sie will. Die Antwort des Servers ist allerdings kein reines JSON. Wir müssen aus dem response Objekt noch, mit Hilfe des .json() Befehls, die JSON extrahieren.Und so schnell haben wir auch schon unser erstes JSON Objekt.   Der Post Request In einem weiteren Schritt, werden wir nun eine post Request durchführen. Auch hierfür gibt es eine API auf reqres, mit der wir das simulieren können. Post request sind sicherer als get Requests und werden daher auch öfter verwendet. Ein Gutes Beispiel dafür wäre ein post Request für ein Authentification Token. Dieser würde typischerweise über einen post Request ablaufen, bei dem man die eigenen Zugansdaten zum Server schickt und dieser bei erfolgreichem Login mit einem Zugangstoken antwortet. Im Anschluss, packt man den Token für die folgenden post oder get Requests in den Header der Anfragen und gibt dem Server so zu erkennen, dass man für die Zugriffe authorisiert ist.

host = "https://reqres.in"

try:
   
    
    #get content
    response_get = requests.get(host + "/api/users/2")
    content = response_get.json()
    
    print(content)
    
    response_get.raise_for_status()    
    
    #from specific to more general errors
except requests.exceptions.HTTPError as errh:
    print ("Http Error:",errh)
except requests.exceptions.ConnectionError as errc:
    print ("Error Connecting:",errc)
except requests.exceptions.Timeout as errt:
    print ("Timeout Error:",errt)

In diesem Beispiel beginnen wir mit einem post Request. Im unterschied zum get Request, muss bei einem post Request ein JSON Objekt an den Server geschickt werden, in dem genau drin steht, was wir wollen. In unserem Fall ist das ein Authentifizierungstoken. Dafür braucht die API unser Zugansdaten, welche wir ganz oben in der JSON „param“ gespeichert haben. Bei unserer post Request schicken wir diese nun mit, und sagen dazu noch, dass es sich um eine JSON handelt: json = param. Zurück bekommen wir dann folgendes JSON:

{'token': 'QpwL5tke4Pnpja7X4'}

Mit dem darin enthaltenen Token, können wir nun weiter arbeiten. Wir definieren einen Header, in den wir das Token stecken und schicken diesen bei unserem get Request mit an den Server. Die API simuliert nun eine kleine Verzögerung bis wir unsere Antwort bekommen (Wow, diese Immersion!) und spuckt uns dann die gewünschten Daten als JSON aus. Tatsächlich lässt sich dieses Szenario nur bedingt gut mit den Kostenlosen APIs von reques testen, da der get Request eigentlich keine Authorisierung benötigt. Unser header, inklusive Token wird vom Server komplett ignoriert, daher packen wir ihn einfach mit rein und tun einfach so als wäre er notwendig. Eine echte Abfrage könnte durchaus aussehen wie unser Beispiel, viele APIs arbeiten allerdings ausschließlich mit post Requests. Aber auch das sollte ja nach diesem kleinen Tutorial kein Problem mehr sein :).

Das könnte Dich auch interessieren

WordPress-Hooks – Filters und Actions

WordPress-Hooks – eine der wichtigsten Programmier-Schnittstellen, die Entwickler bei der Arbeit mit WordPress nutzen können. Sie erlauben es, Code einzufüg...

Gamification im SÜDKURIER

Im Zuge des ersten internen Hackathons, hatten Olli und ich die Idee, uns mit dem Thema Gamification von SÜDKURIER Online zu beschäftigen. Neben einem recht s...

Shell: Backup-script

Eine einfache Backup-Lösung lässt sich schnell und einfach realisieren. Es sollen Datenbank sowie Dateien gesichert und Sicherungen, die älter als eine besti...