Ga naar hoofdinhoud

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.

Hoe werk je dit labo door?
  1. Doe eerst, denk daarna. Vink de stappen af terwijl je ze uitvoert; je voortgang blijft bewaard in je browser.
  2. Schrijf je waarneming zelf op voor je met het modelantwoord vergelijkt.
  3. De controlevragen zijn af te lezen in je eigen terminal of Network tab.
  4. De hulp neemt af. De laatste oefeningen geven geen hints meer.
Twee testservers
  • jsonplaceholder.typicode.com doet alsof: je POST krijgt netjes 201 en een id, 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.

Doe-opdrachtStuur je eerste requests met curl en lees de uitvoer.0 / 5 stappen

Vergelijk de twee requests. Wat bleef gelijk, wat veranderde, en wat zegt de tweede statuscode over waar het probleem zit?

Schrijf eerst zelf op wat je zag.

Controleer wat je ziet​

1.Welke statuscode geeft `/posts/1` terug?
2.Welke statuscode geeft `/posts/9999` terug?
3.Welk teken staat in `curl -v` vooraan de regels die jij verstuurt?
4.Welke Content-Type staat in de response van jsonplaceholder?
curl op Windows

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.

Doe-opdrachtVerstuur data met een POST, en ontdek wat de Content-Type-header doet.0 / 6 stappen

Wat veranderde er in het antwoord van httpbin toen je de Content-Type-header wegliet, en waarom is dat belangrijk?

Schrijf eerst zelf op wat je zag.

Welke statuscode gaf jsonplaceholder op je POST, en wat voegde de server toe aan wat je verstuurde?

Schrijf eerst zelf op wat je zag.

Controleer wat je ziet​

1.Welke statuscode geeft jsonplaceholder op een geslaagde POST?
2.Met welke curl-flag stuur je een extra header mee?
3.Met welke curl-flag stuur je de body mee?
4.In welk veld van het httpbin-antwoord staat je JSON als de Content-Type klopt?

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.

Doe-opdrachtBouw hetzelfde request na in Postman en vergelijk de twee tools.0 / 6 stappen

Noteer twee dingen die je in Postman sneller terugvindt dan in curl, en één ding dat curl juist duidelijker toont.

Schrijf eerst zelf op wat je zag.

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?

Doe-opdrachtOntleed een echt request in de Network tab.0 / 7 stappen

Welke gegevens uit dit request kwamen van jou, en welke van de server? Zet ze in twee kolommen.

Schrijf eerst zelf op wat je zag.

Schermafbeelding van het tabblad Headers in Chrome DevTools bij een fetch-request, met de drie blokken General, Response Headers en Request Headers omkaderd.


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.

Doe-opdrachtLok statuscodes bewust uit in plaats van erop te wachten.0 / 6 stappen

Noteer per commando de statuscode, en zeg telkens waar je zou gaan zoeken als je die code onverwacht kreeg.

Schrijf eerst zelf op wat je zag.

Controleer wat je ziet​

1.Welke code krijg je van `httpbin.org/basic-auth/...` zonder inloggegevens?
2.Welke code krijg je van `httpbin.org/redirect/1` zonder de vlag -L?
3.Welke code hoort bij een geslaagd verzoek zonder body?
4.Bij welke categorie ligt het probleem aan de kant van de server? Geef het eerste cijfer.

Oefening 6 – De juiste methode kiezen​

Acht situaties, vijf methoden. Kies per situatie, en let op het verschil tussen volledig vervangen en gedeeltelijk aanpassen.

1.De lijst met alle bestellingen van een klant tonen
2.Een nieuwe bestelling plaatsen
3.Enkel het e-mailadres van een profiel wijzigen
4.Een volledig profiel vervangen door nieuwe gegevens
5.Een bestelling annuleren en definitief verwijderen
6.De details van product 42 opvragen
7.Een foto toevoegen aan een fotoalbum
8.De volledige tekst van een artikel overschrijven met een nieuwe versie

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.

Scenario: een bibliotheek

Je bouwt de API voor de uitleendienst van een bibliotheek. Dit moet mogelijk zijn:

  1. De volledige lijst van boeken opvragen.
  2. Eén boek opvragen op basis van zijn id.
  3. Een nieuw boek toevoegen aan de collectie.
  4. Van één boek enkel het aantal beschikbare exemplaren aanpassen.
  5. Een boek definitief uit de collectie verwijderen.
  6. De boeken filteren op auteur, in pagina's van twintig.
  7. De lopende ontleningen van één lid opvragen.
Doe-opdrachtOntwerp de endpoints van een kleine API.0 / 4 stappen

Schrijf je zeven endpoints uit, telkens als METHODE /pad → statuscode.

Schrijf eerst zelf op wat je zag.

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.

Doe-opdrachtLok een CORS-fout uit en stel vast wat er echt gebeurde.0 / 6 stappen

Het eerste verzoek werd geblokkeerd, maar curl haalde diezelfde pagina probleemloos op. Verklaar dat verschil in eigen woorden.

Schrijf eerst zelf op wat je zag.

Controleer wat je ziet​

1.Welke response header bepaalt of je JavaScript de response mag lezen?
2.Welke header voegt de browser zelf toe aan een cross-origin verzoek?
3.Welke methode gebruikt de browser voor een preflight?
4.Uit hoeveel delen bestaat een origin?

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()
Doe-opdrachtLos een CORS-fout op aan de kant waar de oplossing hoort: de server.0 / 8 stappen

Beide servers draaiden op jouw eigen machine. Waarom was dit toch cross-origin, en wat loste het precies op?

Schrijf eerst zelf op wat je zag.
Wat je nooit doet

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.

Doe-opdrachtZoek zelf, met curl, Postman of DevTools. Vink af wat je gevonden hebt.0 / 8 stappen

Denk tot slot na over deze vragen:

  • Punt 7: wat verschilt er in de response tussen je PUT en je PATCH, 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.