Tilbake
4.2
Hente data fra API-er

4.2 Hente data fra API-er

Bruke requests-biblioteket til å hente og behandle data.

60 min
6 oppgaver
RequestsGETAutentiseringStatuskoder
Du leser den lesevennlige versjonen
Din fremgang i kapitlet
0 / 6 oppgaver

Fra teori til levende data

Nå som du vet hva et API er, skal vi faktisk bruke ett i Python. Verktøyet heter requests – et bibliotek som gjør det enkelt å sende HTTP-forespørsler og motta svar. Det er ikke en del av standard Python, så du må installere det først med pip install requests, og deretter importere det med import requests.

Din aller første API-forespørsel kan se slik ut, mot test-API-et JSONPlaceholder:

import requests

response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
print(response.status_code)   # 200
data = response.json()
print(data['title'])

Tre ting skjer her. requests.get() sender en GET-forespørsel. response.status_code gir HTTP-statuskoden, der 200 betyr OK. Og response.json() konverterer JSON-svaret til en Python-dictionary du kan jobbe med direkte. Med disse tre byggesteinene kan du hente data fra nesten hvilket som helst API på nettet.

📝Oppgave Quiz 1

Statuskoder og feilhåndtering

Forespørsler går ikke alltid bra, og HTTP-statuskoder forteller deg hvordan det gikk. Kodene grupperes etter første siffer. 2xx betyr suksess: 200 OK og 201 Created. 4xx betyr klientfeil – noe galt med din forespørsel: 400 Bad Request, 401 Unauthorized (mangler autentisering) og 404 Not Found. 5xx betyr serverfeil, som 500 Internal Server Error og 503 Service Unavailable. Du bør alltid sjekke statuskoden før du behandler dataene.

Den enkleste sjekken er en if-test på response.status_code. Men en mer robust tilnærming er try-except. Da kaller du response.raise_for_status(), som automatisk kaster en feil ved 4xx eller 5xx, og fanger ulike feiltyper hver for seg:

try:
    response = requests.get(url, timeout=5)
    response.raise_for_status()
    data = response.json()
except requests.exceptions.HTTPError as e:
    print(f"HTTP-feil: {e}")
except requests.exceptions.ConnectionError:
    print("Kunne ikke koble til serveren.")
except requests.exceptions.Timeout:
    print("Forespørselen tok for lang tid.")

Dette gjør programmet robust mot tre vanlige problemer: HTTP-feil fra serveren, nettverksfeil når det ikke er forbindelse, og timeout når serveren bruker for lang tid. Legg merke til timeout=5, som setter en grense for hvor lenge programmet venter.

📝Oppgave Quiz 2

Parametere, nøkler og JSON-data

Mange API-er lar deg tilpasse svaret med query-parametere. Du kunne lagt dem rett i URL-en, som ?q=python&limit=10, men den anbefalte måten er å sende dem som en dictionary via params:

params = {'latitude': 59.91, 'longitude': 10.75, 'current_weather': True}
response = requests.get('https://api.open-meteo.com/v1/forecast', params=params)

Dette er mer lesbart og håndterer spesialtegn automatisk. På samme måte sendes en API-nøkkel enten som en parameter ({'api_key': nøkkel}) eller i en HTTP-header ({'Authorization': 'Bearer nøkkel'}). Men her gjelder en viktig sikkerhetsregel: lagre aldri nøkler direkte i kode som deles offentlig. Bruk i stedet miljøvariabler, hentet med os.getenv('MY_API_KEY'), og legg eventuelle konfigurasjonsfiler i .gitignore hvis du bruker Git.

Når svaret kommer, oversettes JSON til Python: objekter blir dict, lister blir list, strenger blir str, tall blir int eller float, boolean blir bool, og null blir None. Du navigerer dataene med data['nøkkel'] og data['nested']['value'], eller looper over lister. En klok vane er å bruke .get('nøkkel', 'standard') i stedet for data['nøkkel'] – da unngår du krasj hvis nøkkelen mangler. Et komplett eksempel er en hent_land_info-funksjon som henter data fra REST Countries: den bruker .get('capital', ['Ukjent']) for trygt å hente hovedstaden, og fanger feil hvis landet ikke finnes.

📝Oppgave Quiz 3

Oppsummering

Vi gikk fra teori til levende data. Med requests sender du en GET-forespørsel, sjekker response.status_code og henter data med response.json(). HTTP-statuskoder forteller hvordan det gikk: 2xx er suksess, 4xx er klientfeil (som 404) og 5xx er serverfeil. For robusthet bruker du try-except med raise_for_status() og en timeout, slik at HTTP-feil, nettverksfeil og treghet håndteres elegant.

Du tilpasser svaret med query-parametere sendt som en dictionary via params, og API-nøkler holdes hemmelige i miljøvariabler, ikke i koden. JSON oversettes automatisk til Python-strukturer, og .get() med standardverdi gjør tilgangen trygg. Med dette kan du hente og behandle data fra hele nettet. I neste kapittel ser vi nærmere på selve dataformatene, JSON og XML.

Dette kapitlet er skrevet av Anthropics toppmodeller (Claude Opus og Claude Fable) og er foreløpig ikke manuelt gjennomgått — kvalitetskontrollen gjøres av uavhengige KI-agenter, og innmeldte feil rettes fortløpende. Funnet en feil? Meld fra, så retter vi den. Les mer om hvordan innholdet lages.