Wat zijn API's?

API staat voor Application Programming Interface. Een API is een manier om informatie uit te wisselen tussen verschillende applicaties, zonder dat je zelf alle code hoeft te schrijven of te begrijpen.

Simpel gezegd: Een API is als een sleutel die je toegang geeft tot data van iemand anders. Jij hoeft de database niet te maken, maar krijgt er wel toegang toe.

Praktische voorbeelden van API's

API Type Wat het doet Voorbeeld
Movie API Filmgegevens ophalen Titels, acteurs, posters
Weather API Weersinformatie Temperatuur, regen, wind
News API Nieuws artikelen Headlines, artikelen
Pokemon API Pokemon data Namen, afbeeldingen, stats

Waarom API's gebruiken?

Zonder API's zou je moeten:

  • Zelf een database maken met alle filmgegevens
  • Zelf alle weerdata verzamelen
  • Zelf alle nieuwsartikelen schrijven
  • Alles constant bijwerken

Met API's kun je:

  • Data van bestaande databases gebruiken
  • Altijd de nieuwste informatie krijgen
  • Je focussen op het bouwen van je eigen applicatie
  • Tijd en geld besparen
Voorbeeld: In plaats van zelf alle Pokemon data te verzamelen (898+ Pokemon!), gebruik je gewoon de Pokemon API en krijg je direct toegang tot alles.

Hoe werkt een API?

API's gebruiken werkt precies hetzelfde als het ophalen van data uit een JSON-bestand met fetch().

Stap 1: Van JSON-bestand naar API

JSON-bestand ophalen (zoals je al kent):

fetch('./cars.json')
  .then(response => response.json())
  .then(data => {
    console.log(data);
  });

API ophalen (nieuwe manier):

fetch('https://dragonball-api.com/api/characters')
  .then(response => response.json())
  .then(data => {
    console.log(data);
  });
Het enige verschil: In plaats van een bestandspad (./cars.json) gebruik je een API-URL (https://...).

Stap 2: De data begrijpen

Wanneer je data uit een API ophaalt, krijg je vaak een object terug dat er zo uitziet:

{
  "items": [
    { "name": "Goku", "power": 9000 },
    { "name": "Vegeta", "power": 8500 },
    { "name": "Piccolo", "power": 7000 }
  ],
  "total": 3
}
Belangrijke punten:
  • De hele response is een object
  • Binnen dat object zit vaak een array (hier heet het items)
  • Die array bevat meerdere objecten (de karakters)

Stap 3: Door de data loopen

Om alle karakters te tonen, moet je door de array items loopen:

fetch('https://dragonball-api.com/api/characters')
  .then(response => response.json())
  .then(data => {
    // Van 'data' willen we de 'items' array:
    for (let character of data.items) {
      console.log(character.name); // Toont alle namen
    }
  });
Wat gebeurt er stap voor stap:
  1. fetch() haalt data op van de API
  2. .then(response => response.json()) zet de data om naar JavaScript
  3. .then(data => {...}) geeft je toegang tot de data
  4. data.items is de array met alle karakters
  5. for...of loop gaat door elk karakter heen
  6. character.name toont de naam van elk karakter
Let op: Elke API heeft een andere structuur! Gebruik altijd console.log(data) om te zien wat je krijgt.

Volledig werkend voorbeeld

HTML

<div id="characters"></div>

JavaScript

fetch('https://dragonball-api.com/api/characters')
  .then(response => response.json())
  .then(data => {
    const container = document.getElementById('characters');
    
    for (let character of data.items) {
      // Maak een div voor elk karakter
      const characterDiv = document.createElement('div');
      characterDiv.innerHTML = `
        <h3>${character.name}</h3>
        <p>Power Level: ${character.power || 'Onbekend'}</p>
        <img src="${character.image}" alt="${character.name}" width="100">
      `;
      
      // Voeg styling toe
      characterDiv.style.border = '1px solid #ccc';
      characterDiv.style.padding = '10px';
      characterDiv.style.margin = '10px';
      characterDiv.style.borderRadius = '5px';
      
      container.appendChild(characterDiv);
    }
  })
  .catch(error => {
    console.log('Er ging iets mis:', error);
  });

Met error handling

API's kunnen soms niet beschikbaar zijn. Gebruik altijd .catch() voor foutafhandeling:

fetch('https://dragonball-api.com/api/characters')
  .then(response => {
    if (!response.ok) {
      throw new Error('API is niet beschikbaar');
    }
    return response.json();
  })
  .then(data => {
    const container = document.getElementById('characters');
    
    for (let character of data.items) {
      const characterDiv = document.createElement('div');
      characterDiv.innerHTML = `
        <h3>${character.name}</h3>
        <p>Power Level: ${character.power || 'Onbekend'}</p>
      `;
      container.appendChild(characterDiv);
    }
  })
  .catch(error => {
    console.log('Fout:', error);
    // Toon een foutmelding aan de gebruiker
    document.getElementById('characters').innerHTML = 
      '<p>Sorry, data kan niet geladen worden.</p>';
  });
Best practice: Check altijd response.ok en gebruik .catch() voor errors!

API's met Async/Await

Je kunt API's ook ophalen met async/await (moderne en duidelijkere syntax):

Basis voorbeeld

async function haalCharactersOp() {
  try {
    const response = await fetch('https://dragonball-api.com/api/characters');
    
    if (!response.ok) {
      throw new Error('API is niet beschikbaar');
    }
    
    const data = await response.json();
    
    console.log(data);
    
  } catch (error) {
    console.error('Fout:', error);
  }
}

haalCharactersOp();

Volledig voorbeeld met DOM

async function toonCharacters() {
  const container = document.getElementById('characters');
  
  try {
    // Laad indicator:
    container.innerHTML = '<p>Laden...</p>';
    
    // Haal data op:
    const response = await fetch('https://dragonball-api.com/api/characters');
    
    if (!response.ok) {
      throw new Error('API request failed');
    }
    
    const data = await response.json();
    
    // Leeg de container:
    container.innerHTML = '';
    
    // Toon alle characters:
    for (let character of data.items) {
      const div = document.createElement('div');
      div.innerHTML = `
        <h3>${character.name}</h3>
        <p>Power: ${character.power || 'Onbekend'}</p>
        <img src="${character.image}" alt="${character.name}" width="100">
      `;
      
      div.style.border = '1px solid #ccc';
      div.style.padding = '10px';
      div.style.margin = '10px';
      
      container.appendChild(div);
    }
    
  } catch (error) {
    console.error('Error:', error);
    container.innerHTML = '<p>Fout bij laden van data</p>';
  }
}

// Start functie:
toonCharacters();
Voordeel van async/await: De code is veel leesbaarder en lijkt op normale, synchrone code!

API's met query parameters

Sommige API's accepteren parameters in de URL:

async function zoekCharacter(naam) {
  try {
    // Voeg parameter toe aan URL:
    const response = await fetch(`https://dragonball-api.com/api/characters?name=${naam}`);
    const data = await response.json();
    
    console.log(data);
    
  } catch (error) {
    console.error('Error:', error);
  }
}

// Gebruik:
zoekCharacter('Goku');

Meerdere API calls

async function haalAllesOp() {
  try {
    // Haal meerdere dingen tegelijk op:
    const [characters, planets] = await Promise.all([
      fetch('https://dragonball-api.com/api/characters').then(r => r.json()),
      fetch('https://dragonball-api.com/api/planets').then(r => r.json())
    ]);
    
    console.log('Characters:', characters);
    console.log('Planets:', planets);
    
  } catch (error) {
    console.error('Error:', error);
  }
}

haalAllesOp();

Veelvoorkomende problemen

1. Cannot read property of undefined

// Probleem: data.items bestaat niet
console.log(data.items); // undefined

// Oplossing: Controleer eerst of het bestaat
if (data.items) {
  console.log(data.items);
} else {
  console.log('Items array niet gevonden');
  console.log('Data structuur:', data); // Kijk wat je wél krijgt
}

2. CORS error

// Error: "Access to fetch has been blocked by CORS policy"

// Probleem: Sommige API's blokkeren requests van browsers
// Oplossing: 
// - Gebruik een andere API
// - Of gebruik een CORS proxy (voor development)
// - Of vraag de API eigenaar om CORS in te schakelen

3. API key required

// Sommige API's hebben een sleutel nodig
// 1. Registreer op hun website voor een gratis key
// 2. Voeg de key toe aan je URL:

const API_KEY = 'jouw-api-key-hier';
const url = `https://api.example.com/data?key=${API_KEY}`;

fetch(url)
  .then(response => response.json())
  .then(data => console.log(data));

4. Verkeerde data structuur

// Je verwacht data.items maar krijgt data.results

// Oplossing: Log eerst de hele data om te zien wat je krijgt
fetch('https://api.example.com/data')
  .then(response => response.json())
  .then(data => {
    console.log('Hele data object:', data); // Kijk hier!

    // Nu zie je welke property de array bevat:
    // Misschien is het data.results?
    // Of misschien data.data?
    // Of misschien is data zelf al een array?
  });
Debugging tip: Gebruik altijd console.log(data) eerst om de structuur te begrijpen!

Tips voor het werken met API's

1. Test in browser

Ga naar de API-URL in je browser om te zien hoe de data eruitziet

2. Console.log

Log altijd eerst de hele data om te begrijpen wat je krijgt

3. Lees documentatie

Elke API heeft documentatie die uitlegt welke data je krijgt

4. Error handling

Gebruik altijd .catch() of try/catch

5. Start simpel

Begin met één stukje data tonen voordat je alles gaat stylen

6. Check response.ok

Controleer altijd of de API call succesvol was

Gratis API's om mee te oefenen

API URL Wat je krijgt
Pokemon API https://pokeapi.co/api/v2/pokemon Pokemon data
Dragon Ball API https://dragonball-api.com/api/characters Dragon Ball characters
Rick & Morty API https://rickandmortyapi.com/api/character Rick & Morty characters
JSONPlaceholder https://jsonplaceholder.typicode.com/users Fake user data (voor testen)
Nu kun je:
  • API's gebruiken met fetch()
  • Data ophalen en tonen op je pagina
  • Async/await gebruiken voor duidelijkere code
  • Errors netjes afhandelen
  • Door API data loopen met for...of
  • Query parameters toevoegen aan API calls

Cheat sheet

// Basic API call template met async/await:
async function haalDataOp() {
  try {
    const response = await fetch('API_URL_HIER');
    
    if (!response.ok) {
      throw new Error('API error');
    }
    
    const data = await response.json();
    
    console.log(data); // Kijk eerst wat je krijgt!

    // Werk met data...
    for (let item of data.items) { // Of data.results, of data zelf
      console.log(item);
    }
    
  } catch (error) {
    console.error('Error:', error);
  }
}

haalDataOp();