Presentationer Slide 1/1

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_code visar hur anropet gick.
  • text innehå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?

  1. GET-förfrågan skickas.
  2. Servern svarar med statuskod 200.
  3. response.json() tolkar JSON-svaret.
  4. Resultatet sparas i data.
  5. 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

  1. Statuskod 200 med giltig JSON.
  2. HTTP-fel, exempelvis 404.
  3. Nätverket är frånkopplat.
  4. Servern svarar för långsamt.
  5. JSON saknar en nyckel som programmet använder.

Eget program

Arbetsordning

  1. Välj ett öppet API.
  2. Läs dokumentationen och hitta rätt endpoint.
  3. Hämta och skriv ut hela svaret.
  4. Välj den data programmet behöver.
  5. Lägg till statuskontroll och felhantering.
  6. 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.