Netwerken – HTTP als protocol
In dit labo stuur je zelf requests: eerst met curl, dan met Postman, dan vanuit de browser. Je lokt statuscodes bewust uit in plaats van erop te wachten, je ontwerpt de endpoints van een kleine API, en je sluit af met de fout die elke webontwikkelaar minstens één keer een namiddag kost: CORS. Die los je hier niet alleen op, je bouwt hem eerst zelf na.
Raadpleeg deze secties als je iets wil nalezen:
- Doe eerst, denk daarna. Vink de stappen af terwijl je ze uitvoert; je voortgang blijft bewaard in je browser.
- Schrijf je waarneming zelf op voor je met het modelantwoord vergelijkt.
- De controlevragen zijn af te lezen in je eigen terminal of Network tab.
- De hulp neemt af. De laatste oefeningen geven geen hints meer.
- jsonplaceholder.typicode.com doet alsof: je POST krijgt netjes
201en eenid, maar er wordt niets bewaard. - httpbin.org kaatst je request terug als JSON, inclusief je headers en je body. Ideaal om te zien wat je nu écht verstuurde.
Oefening 1 – Je eerste requests met curl
Je begint met lezen: wat verstuurt curl, wat komt er terug, en waar staat wat.
Vergelijk de twee requests. Wat bleef gelijk, wat veranderde, en wat zegt de tweede statuscode over waar het probleem zit?
Controleer wat je ziet
In PowerShell is curl standaard een alias voor Invoke-WebRequest, dat andere vlaggen gebruikt. Typ daarom altijd curl.exe in plaats van curl, of werk in Git Bash. In cmd en Git Bash werkt curl gewoon.
Oefening 2 – Data versturen met POST
Nu stuur je zelf iets mee. Onderweg ontdek je wat er misgaat als de Content-Type-header ontbreekt, en dat is de fout die je later het vaakst zal moeten herkennen.
Wat veranderde er in het antwoord van httpbin toen je de Content-Type-header wegliet, en waarom is dat belangrijk?
Welke statuscode gaf jsonplaceholder op je POST, en wat voegde de server toe aan wat je verstuurde?
Controleer wat je ziet
Oefening 3 – Hetzelfde request in Postman
Dezelfde twee requests, andere verpakking. Het doel is dat je na afloop kan zeggen wanneer je welke tool bovenhaalt.
Noteer twee dingen die je in Postman sneller terugvindt dan in curl, en één ding dat curl juist duidelijker toont.
Oefening 4 – Ontleden in de Network tab
Curl toont je de tekst, DevTools toont je dezelfde informatie in blokken. Je zoekt nu gericht: welk gegeven kwam van jou, en welk van de server?
Welke gegevens uit dit request kwamen van jou, en welke van de server? Zet ze in twee kolommen.

Oefening 5 – Statuscodes uitlokken
Wachten tot je toevallig een 401 tegenkomt, duurt lang. httpbin geeft je elke code op verzoek, dus lok ze uit en kijk wat er telkens gebeurt.
Noteer per commando de statuscode, en zeg telkens waar je zou gaan zoeken als je die code onverwacht kreeg.
Controleer wat je ziet
Oefening 6 – De juiste methode kiezen
Acht situaties, vijf methoden. Kies per situatie, en let op het verschil tussen volledig vervangen en gedeeltelijk aanpassen.
Oefening 7 – Ontwerp zelf een API
Nu zet je methode, pad en statuscode samen. Je ontwerpt de endpoints voor een klein systeem, en controleert je eigen ontwerp op de twee REST-regels.
Je bouwt de API voor de uitleendienst van een bibliotheek. Dit moet mogelijk zijn:
- De volledige lijst van boeken opvragen.
- Eén boek opvragen op basis van zijn id.
- Een nieuw boek toevoegen aan de collectie.
- Van één boek enkel het aantal beschikbare exemplaren aanpassen.
- Een boek definitief uit de collectie verwijderen.
- De boeken filteren op auteur, in pagina's van twintig.
- De lopende ontleningen van één lid opvragen.
Schrijf je zeven endpoints uit, telkens als METHODE /pad → statuscode.
Oefening 8 – Een CORS-fout uitlokken
De klassieker. Je lokt de fout uit, en stelt daarna vast dat het request wel degelijk vertrok. Dat inzicht is het halve werk.
Het eerste verzoek werd geblokkeerd, maar curl haalde diezelfde pagina probleemloos op. Verklaar dat verschil in eigen woorden.
Controleer wat je ziet
Oefening 9 – Een CORS-fout oplossen
Twee servers op je eigen laptop volstaan om het probleem na te bouwen, en om het op te lossen aan de kant waar de oplossing hoort.
Gebruik dit als index.html, geopend via Live Server (poort 5500):
<!DOCTYPE html>
<html lang="nl">
<head><meta charset="utf-8" /><title>CORS-test</title></head>
<body>
<h1>CORS-test</h1>
<script>
fetch('http://localhost:8000/data.json')
.then(r => r.json())
.then(d => console.log('Gelukt:', d))
.catch(e => console.error('Mislukt:', e));
</script>
</body>
</html>
En dit als server.py, voor de tweede helft van de oefening:
from http.server import SimpleHTTPRequestHandler, HTTPServer
class CorsHandler(SimpleHTTPRequestHandler):
def end_headers(self):
self.send_header('Access-Control-Allow-Origin', 'http://127.0.0.1:5500')
super().end_headers()
HTTPServer(('127.0.0.1', 8000), CorsHandler).serve_forever()
Beide servers draaiden op jouw eigen machine. Waarom was dit toch cross-origin, en wat loste het precies op?
Een browserextensie installeren die CORS uitschakelt, of Chrome starten met --disable-web-security. Het probleem verdwijnt dan enkel op jouw machine: je bezoekers krijgen de fout gewoon. Bovendien zet je daarmee de beveiliging uit voor élke site die je daarna bezoekt.
Uitdaging – De grote request-zoektocht
Geen stappenplan en geen modelantwoorden meer: kies zelf je tool per vraag. Noteer per vondst welke tool je gebruikte en hoe je aan het antwoord kwam.
Denk tot slot na over deze vragen:
- Punt 7: wat verschilt er in de response tussen je
PUTen jePATCH, en wat zou er in een echte API met je ontbrekende velden gebeurd zijn? - Welke tool bleek voor jou het handigst: curl, Postman of de Network tab? Verantwoord je keuze met een voorbeeld uit dit labo.