← Tilbake

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

Fetch

Hent data

Vi bruker fetch() for å sende en forespørsel til et API og få svar tilbake.

JSON

Les svaret

De fleste API-er svarer med JSON, altså strukturert data med nøkler og verdier.

DOM

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.

Husk: Du må vite hva API-et kan tilby, og hva feltene heter. Derfor er dokumentasjonen viktig.

Typisk arbeidsflyt:

  1. Finn dokumentasjonen til API-et.
  2. Se hvilke data som finnes.
  3. Bygg riktig URL med riktige parametere.
  4. Bruk fetch().
  5. Se på JSON-svaret.
  6. 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.

https://api.open-meteo.com/v1/forecast?latitude=59.7439&longitude=10.2045&hourly=temperature_2m,precipitation_probability,windspeed_10m&current=temperature_2m,weather_code,wind_speed_10m
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;
Tips: Begynn alltid med 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:

Forslag til kombinasjoner:

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);
Hvorfor er det 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”

Oppdrag

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:

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.";
}