Ga naar hoofdinhoud

HTTP-headers

De startlijn zegt wat je wil, de body bevat de gegevens. Alles daartussen zijn headers: sleutel-waardeparen met metadata over het bericht.

GET /posts/1 HTTP/1.1 ← startlijn
Host: jsonplaceholder.typicode.com ┐
Accept: application/json ├ headers
Authorization: Bearer eyJhbGci... ┘
← lege regel
(body, indien aanwezig)

Die lege regel is niet decoratief: ze markeert het einde van de headers. Alles erna is body.

Headers lijken bijzaak tot je iets debugt. Dan blijkt dat de helft van je problemen erin staat: een ontbrekende Content-Type, een token dat niet meegestuurd wordt, een cache die te lang blijft plakken, of een Access-Control-Allow-Origin die er niet is.

Request-headers: wat de client meestuurt​

HeaderVoorbeeldWaarvoor
HostHost: www.ap.beVoor welk domein het verzoek bedoeld is. Verplicht in HTTP/1.1
User-AgentUser-Agent: Mozilla/5.0 ...Welke client het verzoek stuurt
AcceptAccept: application/jsonWelke formaten de client aankan
Accept-LanguageAccept-Language: nl-BE, nl;q=0.9In welke taal het antwoord het liefst is
AuthorizationAuthorization: Bearer eyJhbGci...Wie je bent. Nodig bij elk request, want HTTP is stateless
Content-TypeContent-Type: application/jsonHet formaat van de body die je meestuurt
Content-LengthContent-Length: 47Hoe groot die body is
CookieCookie: session=abc123Cookies die je eerder van deze server kreeg
OriginOrigin: http://localhost:5173Vanaf welke site het verzoek vertrekt. Zie CORS
Waarom Host verplicht is

Eén server met één IP-adres bedient vaak honderden domeinen. Het pad /index.html is dan niet genoeg: pas met Host: www.ap.be weet nginx welke site je bedoelt. Dat is ook waarom de host in de TLS-handdruk apart meegestuurd wordt: het certificaat moet gekozen worden vóór het request leesbaar is.

Response-headers: wat de server meegeeft​

HeaderVoorbeeldWaarvoor
Content-TypeContent-Type: text/html; charset=UTF-8Hoe de body geïnterpreteerd moet worden
Content-LengthContent-Length: 4823Grootte van de body in bytes
Cache-ControlCache-Control: max-age=3600Hoelang de client dit mag bewaren
LocationLocation: https://ap.be/nieuwWaar de client naartoe moet bij een 3xx
Set-CookieSet-Cookie: session=abc123; HttpOnlyEen cookie dat de client moet bewaren
Access-Control-Allow-OriginAccess-Control-Allow-Origin: *Welke andere origins de response mogen lezen
ServerServer: nginx/1.24.0Welke serversoftware antwoordde
Retry-AfterRetry-After: 120Wanneer je het opnieuw mag proberen na 429 of 503

Content-Type: de header die het vaakst fout zit​

Content-Type zegt hoe de bytes gelezen moeten worden. Klopt hij niet, dan gaat het mis, ook al is de inhoud perfect.

WaardeWaarvoor
text/htmlEen webpagina
application/jsonAPI-data
application/x-www-form-urlencodedEen gewoon HTML-formulier
multipart/form-dataEen formulier met bestandsupload
image/png, image/jpegAfbeeldingen
text/plainPlatte tekst
De fout die iedereen één keer maakt
curl -X POST https://voorbeeld.be/api/gebruikers -d '{"naam": "Robin"}'

Dit stuurt je JSON, maar curl zet er zelf Content-Type: application/x-www-form-urlencoded bij. De server probeert je JSON dan als formulierdata te lezen en antwoordt met 400 Bad Request. Voeg de juiste header toe:

curl -X POST https://voorbeeld.be/api/gebruikers \
-H "Content-Type: application/json" \
-d '{"naam": "Robin"}'

Headers bekijken​

In DevTools​

Klik een request aan in de Network tab en ga naar Headers. Je krijgt drie blokken:

BlokWat er staat
GeneralURL, methode, statuscode, het adres van de server
Response HeadersWat de server meegaf
Request HeadersWat je browser verstuurde

Dat onderscheid is belangrijk bij het debuggen: zoek je een token, dan kijk je bij Request Headers; zoek je waarom iets geblokkeerd wordt, dan bij Response Headers.

Request Headers in Devtools

Met curl​

curl -I https://ap.be # Enkel de response headers (stuurt een HEAD)
curl -v https://ap.be # Request én response, met headers
curl -H "Accept: application/json" https://api.voorbeeld.be/producten
curl -H "Authorization: Bearer mijntoken" https://api.voorbeeld.be/profiel

In de uitvoer van -v beginnen jouw headers met > en die van de server met <:

> GET / HTTP/1.1
> Host: ap.be
> User-Agent: curl/8.1.2
>
< HTTP/1.1 200 OK
< Content-Type: text/html; charset=UTF-8
< Cache-Control: max-age=600
<

Test jezelf​

1. Je stuurt een JSON-body maar krijgt `400 Bad Request`. Welke header controleer je eerst?

2. In welk blok van DevTools zoek je of je token wel degelijk meeging?

3. Waarom is de `Host`-header verplicht in HTTP/1.1?

Onthoud
  • Headers zijn sleutel-waardeparen tussen de startlijn en de body, afgesloten door een lege regel.
  • Belangrijke request-headers: Host (verplicht), Accept, Content-Type, Authorization, Cookie, Origin.
  • Belangrijke response-headers: Content-Type, Cache-Control, Location, Set-Cookie, Access-Control-Allow-Origin.
  • Content-Type beschrijft de body van het bericht waarin hij staat: in een request die van jou, in een response die van de server.
  • In DevTools staan Request Headers en Response Headers in aparte blokken; curl -v toont ze met > en <.