Programmering nivå 2

Kap 5.3 – Hämta data från API med requests

Anropa externa tjänster och använd JSON-data i dina egna program.

Mål med lektionen

När du har arbetat klart med denna lektion ska du:

  • Förstå vad ett API är och hur det används i programmering.
  • Kunna använda biblioteket requests för att hämta data från ett API.
  • Kunna läsa, tolka och använda JSON-data från ett API-svar.
  • Kunna använda API-data i ett eget program.

Så här lär du dig bäst

Du lär dig bäst genom att först testa ett färdigt exempel som hämtar data från ett öppet API. Börja med att bara skriva ut svaret. Undersök sedan vilken information som finns i datan och hur du kan plocka ut specifika delar. När du förstår det kan du bygga ett eget exempel, till exempel för att skriva ut väder, namn eller skämt. Börja alltid enkelt.

Centrala begrepp

  • API - Application Programming Interface, ett gränssnitt för att kommunicera mellan olika program.
  • HTTP-förfrågan - En begäran om information som skickas till ett API, till exempel med metoden GET.
  • JSON - JavaScript Object Notation, ett textformat som används för att skicka strukturerad data.
  • requests - Ett Pythonbibliotek för att skicka HTTP-förfrågningar.

Installera requests

requests ingår normalt inte i Pythons standardbibliotek. Om importen inte fungerar behöver du installera biblioteket i terminalen:

pip3 install requests

Om du använder flera Python-versioner kan detta behövas i stället:

python3 -m pip install requests

Exempel: Hämta ett skämt från ett API

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)

requests.get(url) skickar en GET-förfrågan till API:et. Om statuskoden är 200 betyder det att anropet lyckades. Då kan svaret göras om till Pythondata med response.json().

Att förstå JSON-data

I exemplet ovan innehåller data en ordlista med nycklar och värden:

{
    "id": 74,
    "type": "general",
    "setup": "Why was the stadium so cool?",
    "punchline": "Because it was filled with fans!"
}

Du kan använda data["setup"] för att hämta introduktionen till skämtet och data["punchline"] för poängen.

Robustare variant med try/except

import requests

def hamta_skamt():
    url = "https://official-joke-api.appspot.com/random_joke"

    try:
        response = requests.get(url)
        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. Felmeddelande:", e)

if __name__ == "__main__":
    hamta_skamt()

raise_for_status() gör att programmet kan fånga HTTP-fel med try/except. Det är användbart när API:et inte svarar, när nätverket inte fungerar eller när servern skickar tillbaka en felkod.

Interaktiv övning: simulera ett API-anrop

Testa vad som händer när requests.get(url) får olika typer av svar. Övningen simulerar ett API-anrop, statuskod, JSON-data och felhantering.

Välj ett API-svar och kör simuleringen.

Programmering 2-koppling: övningen visar varför du först kontrollerar statuskod, sedan tolkar JSON och använder try/except för fel som kan uppstå utanför ditt eget program.

Öva själv

Övning 1: Kontrollera ett API-svar

Skicka ett GET-anrop till skämt-API:et från kapitlet. Skriv först ut statuskoden. Om den är 200 ska programmet skriva att anropet lyckades, annars ska det visa ett felmeddelande med statuskoden.

Fundera: Varför bör statuskoden kontrolleras innan JSON-datan används?

När du har försökt själv: visa lösningsförslaget till övning 1 på GitHub.

Övning 2: Plocka ut JSON-värden

Hämta ett skämt, omvandla svaret med response.json() och skriv ut värdena från nycklarna type, setup och punchline. Hantera nätverksfel med try/except.

Fundera: Vilken Python-datastruktur motsvarar JSON-objektet?

När du har försökt själv: visa lösningsförslaget till övning 2 på GitHub.

Övning 3: Sök efter en Pokémon

Fråga användaren efter ett Pokémon-namn och använd det i en URL till PokéAPI. Skriv ut namn, längd och vikt från JSON-svaret. Visa ett särskilt meddelande vid statuskod 404 och hantera nätverksfel.

Testa: ett namn som finns och ett som saknas.

När du har försökt själv: visa lösningsförslaget till övning 3 på GitHub.

Övning 4: Visa hundraser

Hämta listan över alla hundraser från Dog API. JSON-svaret innehåller en dictionary under nyckeln message. Skriv ut hur många raser som finns och skriv sedan ut varje ras med en loop. Lägg till statuskontroll, timeout och felhantering.

Fundera: Vad loopar programmet över när det går igenom en dictionary?

När du har försökt själv: visa lösningsförslaget till övning 4 på GitHub.

Övning 5: Spara slumpanvändare

Svårare övning: Här kombinerar du API, nästlad JSON, listor, funktioner, filhantering och felhantering.

Hämta tre påhittade användare från Random User Generator. Skriv ut varje persons förnamn, efternamn och e-postadress. Spara samma uppgifter i anvandare.txt. Programmet ska hantera statuskoder, nätverksfel och oväntad JSON-data.

Fundera: Vilka delar i JSON-svaret är listor och vilka är dictionaries?

När du har försökt själv: visa lösningsförslaget till övning 5 på GitHub.

Övning 6: Skriv ett program som använder ett API

Svårare övning: Här väljer och undersöker du själv ett öppet API.

  1. Hitta ett öppet API som du kan använda utan registrering.
  2. Skriv kod som hämtar data från API:et.
  3. Skriv ut den information som du tycker är mest intressant.
  4. Lägg till enkel felhantering med statuskoder och try/except.

När du har försökt själv kan du ladda ner ett lösningsförslag som hämtar aktuellt väder från Open-Meteo: kap5-3-open-meteo-losningsforslag.py på GitHub.

Se även ett mer avancerat exempel på en vädertjänst som din lärare har byggt med HTML, CSS och JavaScript. Tjänsten hämtar väderdata från ett API och visar resultatet på en webbsida.

Bra gratis API:er utan registrering

  • Open-Meteo: väderprognoser och aktuellt väder. Ingen API-nyckel krävs för kostnadsfri icke-kommersiell användning inom tjänstens gränser. Dokumentation.
  • PokéAPI: data om Pokémon, förmågor och spel. Dokumentationen anger att ingen autentisering krävs. Dokumentation.
  • Dog API: hundraser och länkar till hundbilder. Dokumentation.
  • Random User Generator: påhittade användaruppgifter för testprogram. Dokumentation.
  • Open Library: sökning efter böcker och författare. Passar små utbildningsprojekt, men följ tjänstens anropsgränser och användningsregler. Dokumentation.

Kontrollera alltid dokumentationen innan du börjar. Kostnadsgränser, adresser och villkor kan ändras. Undvik att skicka många anrop i en loop och lägg alltid till timeout och felhantering.

Sammanfattning

  • Du har lärt dig vad ett API är och hur du använder det i Python.
  • Du har testat biblioteket requests för att hämta information.
  • Du har använt JSON-data i ett eget program.
  • Du har tränat på att tolka svar från ett externt system och använda det i ditt program.

Tillbaka till Kapitel 5