Les 5
Hoe het web werkt: HTTP
Requests, responses, methodes en statuscodes.
🎯 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:
- De browser zoekt via DNS het IP-adres van
www.dekorrel.nlop. - Hij maakt een verbinding met de server (bij
httpsversleuteld met TLS). - Hij stuurt een request.
- De server stuurt een response.
- 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
- In het lab draait een kleine API. Haal met
curl -vde lijst/menuop en noteer request- en responseheaders. - Voeg met een POST een item toe, en controleer de statuscode en de
Location-header. - Verwijder een item twee keer en verklaar de statuscodes.
- Lok een
400en een404uit en leg uit waarom de server die geeft. 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
Klaar? Controleer je werk met:
$ beetje check aspnet-les5
📝 Quiz: HTTP
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.