← 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&current=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. Test data uten å kalle API-et

API-er kan være trege, nede eller gi litt andre svar enn du forventer. Derfor er det lurt å skille mellom koden som henter data og koden som plukker ut det du trenger. Den siste delen kan testes med eksempeldata.

Hva tester vi her? Vi tester ikke internett eller selve API-et. Vi tester vår egen kode: Klarer funksjonen å hente riktig verdi fra et JavaScript-objekt som ligner på API-svaret?
function hentTemperatur(data) {
  return data.current.temperature_2m;
}

function lagVaerTekst(data) {
  const temperatur = hentTemperatur(data);
  return `Temperatur: ${temperatur}°C`;
}

const eksempeldata = {
  current: {
    temperature_2m: 5.7,
    wind_speed_10m: 14.2
  }
};

console.assert(
  hentTemperatur(eksempeldata) === 5.7,
  "Skal hente temperaturen fra current.temperature_2m"
);

console.assert(
  lagVaerTekst(eksempeldata) === "Temperatur: 5.7°C",
  "Skal lage riktig værtekst"
);

Dette er en trygg måte å jobbe på: først forstår du datastrukturen, så tester du logikken, og til slutt kobler du funksjonen til ekte API-data og HTML.

9. 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);
  }
}

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