Beetje Coderen

Les 5

Hoe het web werkt: HTTP

Requests, responses, methodes en statuscodes.

⏱ 45–60 minuten leestijd + oefenen

🎯 Na deze les kun je

  • een HTTP-request en -response ontleden
  • methodes en statuscodes uitleggen
  • requests inspecteren met DevTools en curl

Voordat je zelf een webserver bouwt, moet je weten wat er tussen browser en server heen en weer gaat. Dat is HTTP: een eenvoudig tekstprotocol van verzoeken (requests) en antwoorden (responses). Als je HTTP begrijpt, zijn routing, statuscodes, cookies en API's in de rest van de cursus geen magie meer. In deze les ontleed je requests en responses, en onderzoek je ze met de devtools en met curl.

Request en response

Je typt https://www.dekorrel.nl/menu in de adresbalk. Er gebeurt dit:

  1. De browser zoekt via DNS het IP-adres van www.dekorrel.nl op.
  2. Hij maakt een verbinding met de server (bij https versleuteld met TLS).
  3. Hij stuurt een request.
  4. De server stuurt een response.
  5. Staan er in de HTML verwijzingen naar CSS, scripts of afbeeldingen, dan volgt voor elk een nieuw request.

Elk request staat op zichzelf: HTTP is stateless. De server onthoudt niets tussen twee requests, tenzij je daar zelf iets voor regelt (cookies, les 18).

Een request ontleed

GET /menu/2 HTTP/1.1
Host: localhost:5268
User-Agent: curl/8.14.1
Accept: */*

Deel Voorbeeld Betekenis
Methode GET wat je wilt doen
Pad /menu/2 welke resource; eventueel met een query string: /zoek?q=kroket
Versie HTTP/1.1 protocolversie
Headers Host, Accept, ... extra informatie, één per regel als Naam: waarde
Lege regel einde van de headers
Body (bij GET leeg) gegevens, bijvoorbeeld JSON bij een POST

Een response ontleed

HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Date: Mon, 12 Oct 2026 22:50:52 GMT
Server: Kestrel
Transfer-Encoding: chunked

{"id":2,"naam":"Frikandel","categorie":"snack","prijs":2.40}

De eerste regel bevat de statuscode (200) en een korte omschrijving (OK). Content-Type zegt wat voor gegevens er in de body staan, zodat de ontvanger weet hoe hij ze moet lezen. Kestrel is de webserver die in ASP.NET Core zit; die ga je in les 06 zelf starten.

Methodes

Methode Gebruik Body? Veilig* Idempotent**
GET ophalen nee ja ja
POST iets nieuws maken, of een actie uitvoeren ja nee nee
PUT een resource helemaal vervangen ja nee ja
PATCH een deel wijzigen ja nee nee***
DELETE verwijderen meestal niet nee ja

* Veilig: verandert niets op de server. Daarom mag een browser of zoekmachine een GET altijd herhalen of vooraf ophalen. ** Idempotent: twee keer hetzelfde request heeft hetzelfde effect als één keer. Twee keer DELETE /menu/3 laat item 3 weg; twee keer POST /menu maakt twee items. *** Kan idempotent zijn, maar dat is niet gegarandeerd.

Verander nooit iets met een GET-request, zoals GET /menu/3/verwijder. Browsers, zoekmachines en linkvoorbeelden in chatapps volgen links automatisch, en dan verdwijnt je menu.

Statuscodes

Het eerste cijfer zegt het meest:

Reeks Betekenis Veelvoorkomend
2xx gelukt 200 OK, 201 Created (na een POST, met een Location-header), 204 No Content (gelukt, geen body)
3xx kijk ergens anders 301 Moved Permanently, 302 Found, 304 Not Modified (je cache is nog goed)
4xx de client deed iets fout 400 Bad Request, 401 Unauthorized (niet ingelogd), 403 Forbidden (ingelogd, maar geen recht), 404 Not Found, 409 Conflict, 422 Unprocessable Content
5xx de server ging fout 500 Internal Server Error, 503 Service Unavailable

Een goede API geeft de juiste code, zodat een client zonder de tekst te lezen weet wat er aan de hand is. 200 OK met in de body {"fout": "niet gevonden"} is verwarrend; geef dan 404.

Belangrijke headers

Header Richting Doet
Host request welke site (één server kan er veel hosten)
Content-Type beide type van de body: application/json, text/html, application/x-www-form-urlencoded (formulier)
Accept request welk type de client terug wil
Authorization request inloggegevens of een token (les 20)
Cookie / Set-Cookie request / response cookies (les 18)
Location response waar de nieuwe resource staat (bij 201) of waarheen (bij 3xx)
Cache-Control response hoe lang bewaren (les 22)

Inspecteren met de devtools

Open in de browser de devtools (F12), tabblad Network, en laad een pagina. Je ziet elk request met methode, status, type, grootte en tijd. Klik op een regel voor Headers (request en response), Preview/Response (de body) en Timing. Zet Preserve log aan om requests te bewaren als de pagina doorstuurt.

Inspecteren met curl

curl stuurt requests vanaf de opdrachtregel. Het staat standaard op macOS, Linux en Windows 10/11.

curl https://example.com                 # alleen de body
curl -i https://example.com              # met response-headers
curl -v https://example.com              # alles: ook het request (regels met >) en de response (<)
curl -I https://example.com              # alleen de headers (HEAD-request)

Een POST met JSON:

curl -i -X POST http://localhost:5268/menu \
  -H "Content-Type: application/json" \
  -d '{"naam":"Kaassoufflé","categorie":"snack","prijs":2.50}'
HTTP/1.1 201 Created
Content-Type: application/json; charset=utf-8
Location: /menu/5

{"id":5,"naam":"Kaassoufflé","categorie":"snack","prijs":2.5}
Optie Betekent
-X POST methode
-H "Naam: waarde" header toevoegen
-d '...' body meesturen
-L redirects volgen

Op Windows in PowerShell is curl soms een alias voor iets anders. Typ dan curl.exe. En in de Windows-opdrachtprompt werken enkele aanhalingstekens niet; gebruik dubbele en escape de binnenste: -d "{\"naam\":\"Kroket\"}".

Voorspel: wat zie je bij curl -i http://dekorrel.nl als de site alles naar https doorstuurt?

Een 301 (of 308) met een Location: https://dekorrel.nl/-header en weinig of geen body. Met -L volgt curl de redirect en zie je de echte pagina.

HTTP/2 en HTTP/3

Moderne sites gebruiken HTTP/2 of HTTP/3. Die versturen alles binair en sturen veel requests tegelijk over één verbinding, wat sneller is. De betekenis is precies hetzelfde: methodes, statuscodes, headers en bodies. De devtools en curl laten ze in dezelfde vorm zien.

Typische misverstanden

Misverstand Hoe het zit
"401 en 403 zijn hetzelfde" 401: wie ben je? (niet ingelogd). 403: ik weet wie je bent, maar dit mag je niet.
"Een POST is veiliger dan een GET" Beide zijn even zichtbaar zonder HTTPS. Wel komen GET-parameters in logs en de browsergeschiedenis, dus geen wachtwoorden in een URL.
"De server weet dat ik net op de vorige pagina was" HTTP is stateless; daar zijn cookies voor nodig.

Oefeningen

Oefening 1. Welke methode en statuscode horen bij: een nieuw account aanmaken dat lukt?

Modelantwoord oefening 1

POST, met 201 Created (en een Location-header naar het nieuwe account).

Oefening 2. Een request geeft 415 Unsupported Media Type. Wat is er waarschijnlijk vergeten bij een POST met JSON?

Modelantwoord oefening 2

De header Content-Type: application/json. Zonder die header weet de server niet dat de body JSON is.

Oefening 3. Bekijk met curl -I https://www.rijksoverheid.nl de headers. Noem drie headers en wat ze betekenen.

Modelantwoord oefening 3

Bijvoorbeeld content-type (soort inhoud), cache-control (hoe lang bewaren), strict-transport-security (altijd HTTPS gebruiken voor dit domein). Welke je precies ziet, verschilt per moment.

Lab: HTTP-verkeer onderzoeken met curl

  1. In het lab draait een kleine API. Haal met curl -v de lijst /menu op en noteer request- en responseheaders.
  2. Voeg met een POST een item toe, en controleer de statuscode en de Location-header.
  3. Verwijder een item twee keer en verklaar de statuscodes.
  4. Lok een 400 en een 404 uit en leg uit waarom de server die geeft.
  5. beetje check aspnet-les5

Samenvatting

  • HTTP bestaat uit requests (methode, pad, headers, body) en responses (statuscode, headers, body), en is stateless.
  • GET is veilig; PUT en DELETE zijn idempotent; POST is geen van beide.
  • 2xx gelukt, 3xx elders, 4xx fout van de client, 5xx fout van de server.
  • Onderzoek verkeer met het Network-tabblad of curl -i / curl -v.

Volgende les: je eerste minimal API, en dan sta je zelf aan de serverkant.

Lab

HTTP-verkeer onderzoeken met curl

💻 Dit lab doe je op je eigen computer met Docker. Start de lab-container met (geeft de opdracht een eigen startcommando, gebruik dan dat):

$ docker run -it --rm registry.wizg.it/webhosting/beetje-labs:aspnet-les5

Volg daarna de stappen van de opdracht hierboven. Nog geen Docker? Zie les 14 van Een beetje Linux & Docker. Voor dit lab is er geen live lab in de browser.

Klaar? Controleer je werk met:

$ beetje check aspnet-les5

📝 Quiz: HTTP

5 vragen · 70% nodig om te slagen

1. Welke statuscode hoort bij 'niet ingelogd'?
2. Welke methode is niet idempotent?
3. Wat betekent dat HTTP stateless is?
4. Welke header vertelt de server dat de body JSON is?
5. Wat doet curl -i?

Dit was de laatste gratis les

Je hebt les 1–5 van Een beetje ASP.NET gratis gevolgd. Wil je verder? Met één aankoop (€ 29,00, eenmalig) krijg je de overige 26 lessen, de live labs en het certificaat. Geen abonnement.

Cursus kopen en verdergaan