In vielen Webanwendungen ist es normal, sich über APIs mit verschiedenen Diensten von Drittanbietern zu verbinden. Wenn Sie diese APIs verwenden, können Sie auf Daten wie Wetterinformationen, Sportergebnisse, Filmlisten, Tweets, Suchmaschinenergebnisse und Bilder zugreifen. Sie können APIs auch verwenden, um Ihrer Anwendung Funktionen hinzuzufügen. Beispiele hierfür sind Zahlungen, Terminplanung, E-Mails, Übersetzungen, Karten und Dateiübertragungen. Wenn Sie eine dieser Funktionen selbst erstellen würden, würde das eine Menge Zeit in Anspruch nehmen, aber mit APIs kann es nur Minuten dauern, eine Verbindung zu einer dieser Anwendungen herzustellen und auf ihre Funktionen und Daten zuzugreifen.
In diesem Artikel lernen wir die Python-Requests-Bibliothek kennen, die es Ihnen ermöglicht, HTTP-Anfragen in Python zu senden.
Und da die Verwendung einer API im Senden von HTTP-Anfragen und Empfangen von Antworten besteht, ermöglicht Ihnen Requests die Verwendung von APIs in Python. Wir demonstrieren hier die Verwendung einer Sprachübersetzungs-API, damit Sie ein Beispiel für die Funktionsweise sehen können.
HTTP-Anfragen sind die Art und Weise, wie das Web funktioniert. Jedes Mal, wenn Sie zu einer Webseite navigieren, stellt Ihr Browser mehrere Anfragen an den Server der Webseite. Der Server antwortet dann mit allen Daten, die für die Darstellung der Seite erforderlich sind, und Ihr Browser rendert die Seite dann tatsächlich so, dass Sie sie sehen können.
Der generische Prozess ist folgender: Ein Client (wie ein Browser oder ein Python-Skript, das Anfragen verwendet) sendet einige Daten an eine URL. Dann liest der Server, der sich unter der URL befindet, die Daten, entscheidet, was damit zu tun ist, und gibt eine Antwort an den Client zurück. Schließlich kann der Client entscheiden, was mit den Daten in der Antwort geschehen soll.
Ein Teil der Daten, die der Client in einer Anfrage sendet, ist die Anfragemethode. Einige übliche Anfragemethoden sind GET, POST und PUT. GET-Anfragen dienen normalerweise nur zum Lesen von Daten, ohne dass eine Änderung an etwas vorgenommen wird, während POST- und PUT-Anfragen im Allgemeinen dazu dienen, Daten auf dem Server zu ändern. Die Stripe-API ermöglicht es Ihnen beispielsweise, POST-Anfragen zu verwenden, um eine neue Gebühr zu erstellen, damit ein Benutzer etwas von Ihrer Anwendung kaufen kann.
Anmerkung: Dieser Artikel behandelt GET-Anfragen, da wir keine Daten auf einem Server ändern werden.
Wenn Sie eine Anfrage aus einem Python-Skript oder innerhalb einer Webanwendung senden, können Sie als Entwickler entscheiden, was in jeder Anfrage gesendet wird und was mit der Antwort geschehen soll. Untersuchen wir das also, indem wir zuerst eine Anfrage an Scotch.io senden und dann eine Sprachübersetzungs-API verwenden.
Als Erstes müssen wir die Bibliothek installieren. Dazu installieren wir Requests unter Verwendung von pip
. Es ist eine gute Idee, zuerst eine virtuelle Umgebung zu erstellen, wenn Sie noch keine haben.
- pip install requests
Wir beginnen damit, Requests zum Aufrufen der Site Scotch.io zu verwenden. Erstellen Sie eine Datei namens script.py
und fügen Sie den folgenden Code hinzu. In diesem Artikel haben wir nicht viel Code, mit dem wir arbeiten können. Wenn sich also etwas ändert, können Sie einfach den bestehenden Code aktualisieren, anstatt neue Zeilen hinzuzufügen.
import requests
res = requests.get('https://scotch.io')
print(res)
Dieser Code sendet also lediglich eine GET-Anfrage an Scotch.io. Dies ist die gleiche Art von Anfrage, die Ihr Browser zum Anzeigen dieser Seite gesendet hat. Der einzige Unterschied besteht darin, dass Requests HTML nicht wirklich rendern kann, sodass Sie stattdessen nur das rohe HTML und die anderen Antwortinformationen erhalten.
Wir verwenden hier die Funktion .get()
, aber Requests ermöglicht Ihnen die Verwendung anderer Funktionen wie .post()
und .put()
, um diese Anfragen ebenfalls zu senden.
Sie können sie ausführen, indem Sie die Datei script.py ausführen.
- python script.py
Folgendes erhalten Sie als Ergebnis:
Als Erstes können wir den Statuscode überprüfen. Die HTTP-Codes reichen von 1XX bis 5XX. Häufige Statuscodes, die Sie wahrscheinlich gesehen haben, sind 200, 404 und 500.
Hier ist ein kurzer Überblick über die Bedeutung der einzelnen Statuscodes:
Wenn Sie Ihre eigenen Anfragen durchführen, suchen Sie im Allgemeinen nach Statuscodes in dem Bereich 200.
Requests erkennt, dass 4XX- und 5XX-Statuscodes Fehler sind. Wenn diese Statuscodes also zurückgegeben werden, wird das Antwortobjekt aus der Anfrage zu False
ausgewertet.
Sie können testen, ob eine Anfrage erfolgreich geantwortet hat, indem Sie die Antwort auf Wahrheit prüfen. Beispiel:
if res:
print('Response OK')
else:
print('Response Failed')
Die Meldung „Response Failed“ wird nur dann angezeigt, wenn ein Statuscode 400 oder 500 zurückgegeben wird. Versuchen Sie, die URL in irgendeinen Unsinn zu ändern, um zu sehen, ob die Antwort mit einer 404 fehlschlägt.
Sie können sich den Statuscode direkt ansehen, indem Sie Folgendes hinzufügen:
print(res.status_code)
Dadurch wird Ihnen der Statuscode direkt angezeigt, sodass Sie die Zahl selbst überprüfen können.
Was man außerdem aus der Antwort entnehmen kann, sind die Header. Sie können sie mithilfe des Header-Verzeichnisses auf dem Antwortobjekt ansehen.
print(res.headers)
Die Header werden zusammen mit der Anfrage gesendet und in der Antwort zurückgegeben. Header werden verwendet, damit sowohl der Client als auch der Server wissen, wie die Daten, die in der Antwort/Antwort gesendet und empfangen werden, zu interpretieren sind.
Wir sehen die verschiedenen Header, die zurückgegeben werden. In vielen Fällen werden Sie die Header-Informationen nicht direkt verwenden müssen, aber sie sind vorhanden, wenn Sie sie benötigen.
Der Inhaltstyp ist in der Regel derjenige, den Sie benötigen, da er das Format der Daten offenbart, z. B. HTML, JSON, PDF, Text usw. Aber der Inhaltstyp wird normalerweise von Requests gehandhabt, sodass Sie auf die zurückgegebenen Daten zugreifen können.
Und schließlich können wir bei Betrachtung von res.text
(das funktioniert bei Textdaten, z. B. bei einer HTML-Seite, wie wir sie gerade sehen) das gesamte HTML sehen, das für die Erstellung der Homepage von Scotch benötigt wird. Es wird nicht gerendert, aber stellen fest, dass es so aussieht, als ob es zu Scotch gehört. Wenn Sie dies in einer Datei gespeichert hätten und diese öffnen würden, würden Sie etwas sehen, das der Scotch-Site ähnelt. In einer realen Situation werden mehrere Anfragen für eine einzige Webseite gestellt, um Elemente wie Bilder, Skripte und Formatvorlagen zu laden. Wenn Sie also nur den HTML-Code in einer Datei speichern, sieht diese nicht so aus, wie die Seite Scotch.io in Ihrem Browser aussieht, weil nur eine einzige Anfrage ausgeführt wurde, um die HTML-Daten zu erhalten.
print(res.text)
Lassen Sie uns nun zu etwas Interessanterem übergehen. Wir werden die Yandex Translate API verwenden, um eine Anfrage zur Übersetzung eines Textes in eine andere Sprache durchzuführen.
Um die API zu verwenden, müssen Sie sich zuerst anmelden. Nachdem Sie sich angemeldet haben, gehen Sie zu der Translate API und erstellen einen API-Schlüssel. Sobald Sie den API-Schlüssel haben, fügen Sie ihn als Konstante zu Ihrer Datei hinzu. Hier ist der Link, unter dem Sie all diese Dinge tun können: https://tech.yandex.com/translate/
API_KEY = 'your yandex api key'
Wir benötigen einen API-Schlüssel, damit Yandex uns jedes Mal authentifizieren kann, wenn wir ihre API verwenden wollen. Der API-Schlüssel ist eine leichtgewichtige Form der Authentifizierung, da er beim Senden am Ende der Anfrage-URL hinzugefügt wird.
Um zu wissen, welche URL wir senden müssen, um die API zu verwenden, können wir uns die Dokumentation von Yandex ansehen.
Wenn wir dort nachschauen, sehen wir alle Informationen, die wir für die Verwendung ihrer Translate API zur Übersetzung von Text benötigen.
Wenn wir eine URL mit Und-Zeichen (&), Fragezeichen (?) und Gleichheitszeichen (=) sehen, können Sie sicher sein, dass die URL für GET-Anfragen bestimmt ist. Diese Symbole geben die Parameter an, die mit der URL einhergehen.
Normalerweise sind Angaben in eckigen Klammern ([]) optional. In diesem Fall sind format, options und callback optional, während key, text und lang für die Anfrage erforderlich sind.
Fügen wir also etwas Code hinzu, der an diese URL gesendet werden soll. Sie können die erste von uns erstellte Anfrage wie folgt ersetzen:
url = 'https://translate.yandex.net/api/v1.5/tr.json/translate'
res = requests.get(url)
Es gibt zwei Möglichkeiten, wie wir die Parameter hinzufügen können. Wir können sie entweder direkt an das Ende der URL anhängen, oder wir können dies von Requests erledigen lassen. Um Letzteres zu tun, können wir ein Wörterbuch für unsere Parameter erstellen. Die drei Elemente, die wir benötigen, sind der Schlüssel, der Text und die Sprache. Lassen Sie uns das Wörterbuch unter Verwendung des API-Schlüssels, ‚Hello‘
für den Text und ‚en-es‘
als Sprache erstellen, was bedeutet, dass wir von Englisch nach Spanisch übersetzen wollen.
Wenn Sie weitere Sprachcodes benötigen, können Sie hier nachschauen. Sie suchen nach der Spalte 639-1.
Wir erstellen ein params-Wörterbuch, indem wir die Funktion dict()
verwenden und die Schlüssel und Werte, die wir in unserem Wörterbuch haben wollen, eingeben.
params = dict(key=API_KEY, text='Hello', lang='en-es')
Jetzt nehmen wir das Parameter-Wörterbuch und übergeben es an die Funktion .get()
.
res = requests.get(url, params=params)
Wenn wir die Parameter auf diese Weise übergeben, fährt Requests fort und fügt die Parameter für uns in die URL ein.
Nun fügen wir eine Druckanweisung für den Antworttext hinzu und sehen uns an, was in der Antwort zurückgegeben wird.
print(res.text)
Wir sehen drei Dinge. Wir sehen den Statuscode, der genau derselbe Statuscode der Antwort selbst ist, wir sehen die von uns angegebene Sprache und wir sehen den übersetzten Text innerhalb der Liste. Sie sollten also „Hola“
für den übersetzten Text sehen.
Versuchen Sie noch einmal mit en-fr als Sprachcode und Sie sollten in der Antwort nun „Bonjour“
sehen.
params = dict(key=API_KEY, text='Hello', lang='en-fr')
Schauen wir uns die Header für diese spezielle Antwort an.
print(res.headers)
Offensichtlich sollten die Header unterschiedlich sein, weil wir mit einem anderen Server kommunizieren, aber in diesem Fall ist der Inhaltstyp application/json statt text/html. Das bedeutet, dass die Daten als JSON interpretiert werden können.
Wenn application/json der Inhaltstyp der Antwort ist, können wir die Antwort von Requests in ein Wörterbuch und eine Liste konvertieren lassen, damit wir leichter auf die Daten zugreifen können.
Damit die Daten als JSON geparst werden, verwenden wir die .json()
-Methode auf dem Antwortobjekt.
Wenn Sie es ausdrucken, werden Sie sehen, dass die Daten gleich aussehen, aber das Format etwas anders ist.
json = res.json()
print(json)
Der Grund für den Unterschied liegt darin, dass es sich nicht mehr um reinen Text handelt, den Sie von res.text erhalten. Diesmal ist es eine gedruckte Version eines Wörterbuchs.
Nehmen wir an, wir wollen auf den Text zugreifen. Da dies nun ein Wörterbuch ist, können wir den Schlüssel text verwenden.
print(json['text'])
Und jetzt sehen wir nur noch die Daten für diesen einen Schlüssel. In diesem Fall handelt es sich um eine Liste mit einem Element. Wenn wir also diesen Text direkt in die Liste aufnehmen wollten, können wir über den Index darauf zugreifen.
print(json['text'][0])
Und jetzt sehen wir nur noch das übersetzte Wort.
Wenn wir also unsere Parameter ändern, erhalten wir natürlich andere Ergebnisse. Ändern wir den zu übersetzenden Text von „Hello“
in „Goodbye“
, ändern wir die Zielsprache wieder auf Spanisch und senden die Anfrage erneut.
params = dict(key=API_KEY, text='Goodbye', lang='en-es')
. Versuchen Sie, längere Texte in verschiedene Sprachen zu übersetzen und sehen Sie, welche Antworten die API Ihnen gibt.
Zum Schluss sehen wir uns einen Fehlerfall an. Es funktioniert nicht immer alles, deshalb müssen wir wissen, wenn das passiert.
Versuchen Sie, Ihren API-Schlüssel zu ändern, indem Sie ein Zeichen entfernen. Wenn Sie dies tun, ist Ihr API-Schlüssel nicht mehr gültig. Versuchen Sie dann, eine Anfrage zu senden.
Wenn Sie einen Blick auf den Statuscode werfen, erhalten Sie Folgendes:
print(res.status_code)
Wenn Sie also die API verwenden, sollten Sie prüfen, ob alles erfolgreich ist oder nicht, damit Sie die Fehlerfälle entsprechend den Anforderungen Ihrer Anwendung behandeln können.
Wir haben Folgendes gelernt:
Wenn Sie mehr tun möchten, sehen Sie sich diese Liste an, um die verschiedenen verfügbaren APIs zu sehen, und versuchen Sie, sie mit Python-Requests zu verwenden.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
While we believe that this content benefits our community, we have not yet thoroughly reviewed it. If you have any suggestions for improvements, please let us know by clicking the “report an issue“ button at the bottom of the tutorial.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!