4.1 Verarbeitung von Antworten
Modul requests bietet bequeme Methoden zum Arbeiten mit Serverantworten.
Status-Codes
Neben der Antwort sendet der Server auch den Status der Anfrageverarbeitung. Die Statusinformation befindet sich in den Feldern status_code und reason. Beispiel unten:
import requests
response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
print(response.status_code) # Gibt den Statuscode der Antwort aus
print(response.reason) # Gibt die textliche Beschreibung des Status aus
print(response.ok) # Gibt True zurück, wenn der Statuscode kleiner als 400 ist
Headers
Und natürlich, was wäre eine HTTP-Anfrage ohne Header? Wenn du Anfrage- oder Antwortheader benötigst, kannst du auf sie über das Feld headers zugreifen:
import requests
response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
print(response.headers) # Gibt die Antwortheader aus
print(response.headers['Content-Type']) # Gibt den Wert eines bestimmten Headers aus
Antwortkörper
Die Antwort des Servers kann ein Byte-Set, Text, json oder xml enthalten. Wenn du weißt, was du genau vom Server anforderst, kannst du direkt ein Objekt des gewünschten Typs erhalten, indem du eine der Methoden/Felder nutzt:
import requests
response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
print(response.text) # Gibt den Antwortkörper in Textform aus
print(response.json()) # Gibt den Antwortkörper in JSON aus
print(response.content) # Gibt den Antwortkörper in Bytes aus
Mehr über Header (headers) und Antwortstatus erfährst du in den Vorlesungen über Netzwerktechnologie.
4.2 Fehlerbehandlung
Modul requests bietet Ausnahmen zur Fehlerbehandlung.
Der HTTP-Standard sieht keine Ausnahmen vor, stattdessen arbeitet er mit Fehlercodes (status_code). Wenn du möchtest, dass bei einem fehlgeschlagenen Antrag eine Python-Ausnahme ausgelöst wird, musst du explizit die Funktion raise_for_status() aufrufen.
Beispiel:
import requests
try:
response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
response.raise_for_status() # Erzeugt eine Ausnahme für Status-Codes 4xx und 5xx
except requests.exceptions.HTTPError as err:
print(f"HTTP error occurred: {err}")
except Exception as err:
print(f"Other error occurred: {err}")
else:
print("Success!")
Mehr über Fehlercodes kannst du aus den Vorlesungen über Netzwerktechnologie erfahren.
4.3 Senden von Daten
Vor der Erfindung von JSON wurden große Datenmengen mittels „Formulare” gesendet. Ein Formular ist ein spezielles Objekt der Browserseite (und ein Datenstandard in HTTP). Wenn du Daten „über das Formular” senden möchtest, musst du einfach mit der Anfrage den Parameter data übergeben.
Wichtig! GET-Anfragen unterstützen keine Formulare, da sie keinen Anfragetext enthalten. Alle ihre Daten werden nur in der URL übergeben.
Senden von Daten in GET-Anfrage
In einer GET-Anfrage werden Daten durch URL-Parameter übertragen. Hier ein Beispiel:
import requests
params = {'key1': 'value1', 'key2': 'value2'}
response = requests.get('https://httpbin.org/get', params=params)
print(response.url) # Gibt die URL mit hinzugefügten Parametern aus
Senden von Formulardaten
Wir nutzen eine POST-Anfrage, um Daten an den Server zu senden.
Beispiel:
import requests
data = {
'username': 'example',
'password': 'password'
}
response = requests.post('https://httpbin.org/post', data=data)
print(response.json())
Senden von Dateien
Wenn du Binärdaten ins Internet senden möchtest, beispielsweise ein Bild hochladen, dann musst du deine Datei oder Dateien mit dem Parameter files in die Anfrage einfügen.
Beispiel:
import requests
files = {'file': open('example.txt', 'rb')}
response = requests.post('https://httpbin.org/post', files=files)
print(response.json())
Einfach wie eins, zwei, drei. Wenn du mehrere Dateien senden möchtest, dann liste sie unter beliebigen Namen in der Variable files auf.
Wichtig! Vergiss nicht die Datei nach dem Senden zu schließen, um Ressourcenlecks zu vermeiden. Am besten verwendest du die with-Konstruktion, die die Datei nach Abschluss der Operation automatisch schließt:
import requests
with open('example.txt', 'rb') as f:
files = {'file': f}
response = requests.post('https://httpbin.org/post', files=files)
print(response.json())
4.4 Login und Authentifizierung
API (Application Programming Interface) – das ist ein Satz von Regeln und Protokollen, die es verschiedenen Programmen erlauben, miteinander zu interagieren. Viele Websites und Dienste erlauben das Senden von Anfragen und die Arbeit mit ihrer API nur nach dem Login.
Nach erfolgreicher Anmeldung erhältst du ein spezielles Objekt, eine Sitzung (session), die eine einzigartige Nummer deiner „autorisierte Sitzung mit dem Server“ enthält. Für weitere Anfragen musst du dieses Objekt verwenden.
Authentifizierung
Um sich auf einem Server anzumelden, musst du eine Authentifizierung durchführen (Login-Prozess), wofür du mit der Anfrage Zugangsdaten senden musst.
import requests
from requests.auth import HTTPBasicAuth
response = requests.get('https://httpbin.org/basic-auth/user/pass', \
auth=HTTPBasicAuth('user', 'pass'))
print(response.status_code)
So sieht der Autorisierungsprozess aus, aber normalerweise wird er zusammen mit einer Sitzung verwendet.
Verwendung von Sitzungen
Sitzungen ermöglichen es, Parameter zwischen Anfragen zu speichern, wie cookies oder Informationen über die Benutzerautorisierung.
import requests
payload = {
'username': 'your_username',
'password': 'your_password'
}
# Erstellung einer Sitzung
session = requests.Session()
# Login auf der Website
login_response = session.post('https://example.com/login', data = payload)
# Weitere Arbeit unter der Sitzung des eingeloggten Benutzers
data_response = session.get('https://example.com/api/data')
print(data_response.json())
GO TO FULL VERSION