Kap 5.3
Hämta data från API med requests
Låt ditt Pythonprogram kommunicera med externa tjänster och använda JSON-data.
Mål
Efter lektionen ska du kunna...
- förklara vad ett API är
- skicka en GET-förfrågan med
requests - kontrollera HTTP-svarets status
- tolka JSON som Pythondata
- hantera vanliga fel vid API-anrop
API
Ett gränssnitt mellan program
Ditt Pythonprogram
Skickar en förfrågan.
API
Tar emot förfrågan och skickar tillbaka data.
JSON-svar
Tolkas och används i programmet.
HTTP
GET begär information
GET https://.../random_joke
En GET-förfrågan ber servern att skicka data.
Svaret innehåller bland annat statuskod och innehåll.
GET används normalt för att läsa, inte för att ändra data.
JSON
Strukturerad text
{
"id": 74,
"setup": "Why was the stadium so cool?",
"punchline": "Because it was filled with fans!"
}
JSON innehåller nycklar och värden.
Efter tolkning kan detta användas som en Python-dictionary.
Installation
Installera requests
pip3 install requests
Om flera Pythonversioner finns:
python3 -m pip install requests
requests ingår normalt inte i Pythons standardbibliotek.
Import
Gör biblioteket tillgängligt
import requests
Efter importen kan programmet använda exempelvis
requests.get().
URL
Adressen till resursen
url = "https://official-joke-api.appspot.com/random_joke"
URL:en talar om vilken API-resurs programmet vill använda.
Denna endpoint skickar tillbaka ett slumpmässigt skämt.
Förfrågan
Skicka GET-anropet
response = requests.get(url)
requests.get()kontaktar URL:en.- Programmet väntar på serverns svar.
- Svaret sparas i
response.
Response
Svarsobjektet innehåller flera delar
response.status_code
response.text
response.json()
status_codevisar hur anropet gick.textinnehåller svaret som text.json()försöker tolka svaret som JSON.
Statuskod
200 betyder lyckat svar
if response.status_code == 200:
data = response.json()
else:
print("Kunde inte hämta data.")
Tolka bara det förväntade svaret när anropet lyckades.
Första programmet
Hela grundexemplet
import requests
url = "https://official-joke-api.appspot.com/random_joke"
response = requests.get(url)
if response.status_code == 200:
data = response.json()
print("Skämt:")
print(data["setup"])
print(data["punchline"])
else:
print(
"Kunde inte hämta skämt. Statuskod:",
response.status_code
)
Lyckat flöde
Vad händer steg för steg?
- GET-förfrågan skickas.
- Servern svarar med statuskod
200. response.json()tolkar JSON-svaret.- Resultatet sparas i
data. - Programmet hämtar och skriver ut två värden.
Pythondata
JSON-objekt blir en dictionary
data = response.json()
print(type(data))
print(data["setup"])
print(data["punchline"])
Nycklarna måste stavas som de gör i API-svaret.
Viktigt
Undersök svaret innan du väljer nycklar
print(data)
Börja med att skriva ut hela datastrukturen.
Kontrollera om svaret är en dictionary, lista eller en kombination.
Välj därefter de nycklar och index som programmet behöver.
Externa fel
API-anrop kan misslyckas
- Datorn saknar nätverksanslutning.
- API-servern svarar inte.
- URL:en är felaktig.
- Servern svarar med en HTTP-felkod.
- Svaret innehåller inte giltig JSON.
HTTP-fel
raise_for_status()
response = requests.get(url)
response.raise_for_status()
Metoden gör HTTP-felkoder till undantag.
Undantaget kan sedan fångas med try/except.
Timeout
Vänta inte obegränsat
response = requests.get(url, timeout=10)
Programmet väntar högst ungefär tio sekunder på svaret.
Om tiden överskrids skapas ett undantag som kan fångas.
Robust funktion
Hämta, kontrollera och tolka
def hamta_skamt():
url = "https://official-joke-api.appspot.com/random_joke"
try:
response = requests.get(url, timeout=10)
response.raise_for_status()
data = response.json()
print("\nSkämt:")
print(data["setup"])
print(data["punchline"])
except requests.exceptions.RequestException as e:
print("Kunde inte hämta skämt:", e)
Specifikt undantag
RequestException
except requests.exceptions.RequestException as e:
print("Kunde inte hämta skämt:", e)
Detta fångar vanliga fel från requests.
e innehåller information om vad som gick fel.
Programstart
Kör funktionen när filen startas
if __name__ == "__main__":
hamta_skamt()
Funktionen körs när Pythonfilen startas direkt.
Den körs inte automatiskt om filen importeras som modul.
Testfall
Testa fler än det lyckade svaret
- Statuskod
200med giltig JSON. - HTTP-fel, exempelvis
404. - Nätverket är frånkopplat.
- Servern svarar för långsamt.
- JSON saknar en nyckel som programmet använder.
Eget program
Arbetsordning
- Välj ett öppet API.
- Läs dokumentationen och hitta rätt endpoint.
- Hämta och skriv ut hela svaret.
- Välj den data programmet behöver.
- Lägg till statuskontroll och felhantering.
- Testa både lyckade och misslyckade anrop.
Sammanfattning
Kom ihåg
- Ett API låter program kommunicera.
requests.get()skickar en GET-förfrågan.- Statuskoden visar hur anropet gick.
response.json()tolkar JSON som Pythondata.raise_for_status()gör HTTP-fel fångbara.- Nätverk och externa tjänster kräver felhantering.