JavaScript Modul 4: API-er og ekte data fra nettet
Nå skal du slutte å jobbe bare med “egne” variabler og begynne å hente inn ekte data. Målet er å bygge en liten nettside som bruker minst 2–3 API-er og viser praktisk, gøyal eller overraskende informasjon.
Nye konsepter
Hent data
Vi bruker fetch() for å sende en forespørsel til et API og få svar tilbake.
Les svaret
De fleste API-er svarer med JSON, altså strukturert data med nøkler og verdier.
Vis data på siden
Når du har hentet data, må du plukke ut det du trenger og vise det i HTML-en.
1. Hva er et API egentlig?
Et API er en måte å spørre en server om informasjon på. Du sender en forespørsel til en adresse, og serveren svarer med data. Tenk på det som en meny på en restaurant: du får ikke alt, bare det du faktisk bestiller.
Typisk arbeidsflyt:
- Finn dokumentasjonen til API-et.
- Se hvilke data som finnes.
- Bygg riktig URL med riktige parametere.
- Bruk
fetch(). - Se på JSON-svaret.
- Plukk ut det du trenger og vis det på nettsiden.
2. Eksempel: Open-Meteo
Open-Meteo er et fint første API fordi det ikke krever API-nøkkel, og fordi svaret er ryddig.
Dokumentasjonen viser at du kan be om både current og hourly data,
og at hourly-parameteren kan inneholde flere verdier separert med komma.
| Del | Forklaring |
|---|---|
https://api.open-meteo.com/v1/forecast |
Selve API-adressen |
latitude=59.7439 |
Breddegrad |
longitude=10.2045 |
Lengdegrad |
hourly=... |
Time-for-time data du vil hente |
current=... |
Data akkurat nå |
async function hentVaer() {
const url = "https://api.open-meteo.com/v1/forecast?latitude=59.7439&longitude=10.2045¤t=temperature_2m,weather_code,wind_speed_10m";
const response = await fetch(url);
const data = await response.json();
console.log(data);
}
Her er poenget ikke bare å få data, men å forstå strukturen. Se i Console og finn ut hvor temperaturen faktisk ligger.
3. API-er du kan bruke
Open-Meteo
Vær-app
Ingen API-nøkkel. Bra til temperatur, vind, nedbør og værkode.
https://api.open-meteo.com/v1/forecast?...
The Cat API
Tilfeldige kattebilder
Rask visuell belønning. Random-bilder kan hentes fra
/v1/images/search.
https://api.thecatapi.com/v1/images/search
Dog CEO
Hunde-app
Svært enkelt API med random bilde-endepunkt og rase-lister.
https://dog.ceo/api/breeds/image/random
REST Countries
Land, flagg og fakta
Kan brukes til hovedstad, språk, region, flagg og mye mer. v3.1 er dagens stabile versjon.
https://restcountries.com/v3.1/name/norway
Open Library
Bok-søk
Søk etter bøker, forfattere og omslag. Fint dersom du vil lage søkefunksjon.
https://openlibrary.org/search.json?q=harry+potter
PokéAPI / NASA
Spill / rom
Bra dersom du vil lage noe mer kreativt og tematisk.
https://pokeapi.co/api/v2/pokemon/pikachu
4. Før du koder: lær å lese JSON
Når du bruker fetch() og response.json(), får du et JavaScript-objekt.
Da må du finne riktig sti inn til dataene.
{
"current": {
"temperature_2m": 5.7,
"wind_speed_10m": 14.2,
"weather_code": 3
}
}
Da kan du hente ut verdiene slik:
const temperatur = data.current.temperature_2m;
const vind = data.current.wind_speed_10m;
const kode = data.current.weather_code;
console.log(data).
Da ser du hvordan svaret faktisk ser ut før du prøver å skrive data.noe.noe.
5. Mini-prosjekt: Bygg en “API-mix”-side
Nå skal du lage en nettside som bruker minst 2 API-er, gjerne 3. Målet er at siden skal føles som en liten app, ikke bare som løs kode.
Nettsiden skal inneholde:
- En overskrift og et tydelig tema
- Minst 2 knapper eller input-felt
- Minst 2 API-kall
- Data som vises pent i HTML
- Feilhåndtering hvis noe går galt
Forslag til kombinasjoner:
- Vær + land: vis vær og fakta om landet samtidig
- Katt + hund: “dagens dyreduell”
- Pokémon + vær: hvilken Pokémon passer til dagens vær?
- Bok + land: boktips og info om landet forfatteren kommer fra
6. Starterkode: én knapp som henter noe fra et API
Dette er et veldig fint startpunkt:
// HTML du trenger:
// <button id="catBtn" class="btn btn-primary">Hent katt</button>
// <img id="catImg" class="img-fluid rounded mt-3" alt="Kattebilde">
const catBtn = document.getElementById("catBtn");
const catImg = document.getElementById("catImg");
async function hentKatt() {
const response = await fetch("https://api.thecatapi.com/v1/images/search");
const data = await response.json();
catImg.src = data[0].url;
}
catBtn.addEventListener("click", hentKatt);
data[0].url?
Fordi dette API-et svarer med en array, og første element ligger på plass 0.
7. Litt mer ryddig: bruk funksjoner
Når du bruker flere API-er, blir koden fort rotete. Del derfor opp i funksjoner.
async function hentHund() {
const response = await fetch("https://dog.ceo/api/breeds/image/random");
const data = await response.json();
return data.message;
}
async function visHund() {
const bildeUrl = await hentHund();
document.getElementById("dogImg").src = bildeUrl;
}
Her gjør hentHund() én jobb: hente data.
visHund() gjør en annen jobb: vise data.
8. Feilhåndtering: viktig når du jobber med nettet
API-er virker ikke alltid. Derfor bør du bruke try/catch.
async function hentLand() {
try {
const response = await fetch("https://restcountries.com/v3.1/name/norway");
const data = await response.json();
document.getElementById("landInfo").textContent =
`${data[0].name.common} har hovedstaden ${data[0].capital[0]}.`;
} catch (error) {
document.getElementById("landInfo").textContent =
"Noe gikk galt. Prøv igjen.";
console.error(error);
}
}
9. Oppgaveforslag: “Dagens rare nettside”
Lag en nettside som viser dagens vær i Drammen, et tilfeldig katte- eller hundebilde og ett ekstra datapunkt fra et tredje API eller en ekstra del av samme API.
Siden må minst vise:
- Temperatur nå
- Vind eller nedbør
- Et bilde fra Cat API eller Dog CEO
- En liten tekst du selv skriver ut fra dataene
Eksempel på morsom tekst:
if (temperatur < 0) {
melding.textContent = "Dette er absolutt ikke shorts-vær.";
} else if (temperatur < 10) {
melding.textContent = "Ta på jakke. Helst med glidelås.";
} else {
melding.textContent = "Godkjent utevær i dag.";
}