curl-commando: opties, POST-verzoeken en bestanden downloaden
Het curl-commando is een hulpmiddel dat vanuit de terminal een verzoek naar een webadres stuurt en het antwoord ongewijzigd toont. Met één regel controleer je de inhoud van een pagina, de headers en de statuscode. Toen we vanaf een AlmaLinux 9-server curl-verzoeken naar een WordPress-site stuurden, verwees het http-adres met een 301-antwoord naar het https-adres, en een REST API-verzoek zonder authenticatie werd met 401 geweigerd.
1️⃣ Basisgebruik van het curl-commando en de inhoud van het antwoord
Zet je één adres achter curl, dan stuurt curl een GET-verzoek naar dat adres en toont het de inhoud van het antwoord op het scherm. Toen we de robots.txt opvroegen die WordPress aanmaakt, kwam de inhoud van het bestand van drie regels ongewijzigd terug.
curl https://example.com/robots.txtUser-agent: *
Disallow: /wp-admin/
Allow: /wp-admin/admin-ajax.phpJe verwacht al snel dezelfde pagina als wanneer je het adres in de browser intypt, maar curl toont de ruwe HTML die de server heeft gestuurd. curl voert geen scripts uit en vraagt afbeeldingen en CSS niet apart op. Pagina-HTML is lang, dus bij het adres van een webpagina sturen we de uitvoer via een pipe naar head en bekijken we alleen de eerste regels.
curl -s https://example.com/ | head -n 2<!DOCTYPE html>
<html lang="ko-KR">Met -s verberg je de voortgangsweergave die anders door de uitvoer loopt als je die via een pipe doorgeeft. De HTML die alleen van het adres van de startpagina kwam, was 96.679 bytes. Afbeeldingen en scriptbestanden zitten niet in die grootte.
2️⃣ Headers bekijken met curl -I en omleidingen volgen met -L
Aan de inhoud alleen zie je niet of het verzoek gelukt is, dus controleer je de statuscode en headers apart met -I. -I stuurt een HEAD-verzoek en toont alleen de headers van het antwoord, zonder inhoud. Het is alsof je alleen het verzendlabel leest zonder het pakket open te maken.
curl -I https://example.com/HTTP/2 200
server: nginx/1.28.0
date: Wed, 28 Oct 2026 05:29:23 GMT
content-type: text/html; charset=UTF-8
vary: Accept-Encoding
last-modified: Tue, 27 Oct 2026 21:12:18 GMT
cache-control: max-age=0
expires: Wed, 28 Oct 2026 05:29:23 GMT
accept-ranges: none
alt-svc: h3=":443"; ma=86400De [HTTP/2 200] op de eerste regel is de statuscode. Daaronder volgen het servertype, het inhoudstype en headers voor de cache. Stuur je hetzelfde verzoek naar het http-adres, dan krijg je 301 met in de header [Location] het https-adres waarnaar je moet gaan.
curl -I http://example.com/HTTP/1.1 301 Moved Permanently
Server: nginx/1.28.0
Date: Wed, 28 Oct 2026 05:27:51 GMT
Content-Type: text/html
Content-Length: 169
Connection: keep-alive
Location: https://example.com/Toen we het http-adres zonder opties opvroegen, vroeg curl het adres uit [Location] niet opnieuw op; het toonde alleen de 7 regels inhoud van het 301-antwoord en stopte.
curl http://example.com/<html>
<head><title>301 Moved Permanently</title></head>
<body>
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/1.28.0</center>
</body>
</html>Met -L vraagt curl het adres uit [Location] opnieuw op. Combineer je het met -I tot -IL, dan volgen op de headers van het 301-antwoord de headers van het 200-antwoord.
curl -IL http://example.com/HTTP/1.1 301 Moved Permanently
Server: nginx/1.28.0
Date: Wed, 28 Oct 2026 05:29:23 GMT
Content-Type: text/html
Content-Length: 169
Connection: keep-alive
Location: https://example.com/
HTTP/2 200
server: nginx/1.28.0
date: Wed, 28 Oct 2026 05:29:23 GMT
content-type: text/html; charset=UTF-8
vary: Accept-Encoding
last-modified: Tue, 27 Oct 2026 21:12:18 GMT
cache-control: max-age=0
expires: Wed, 28 Oct 2026 05:29:23 GMT
accept-ranges: none
alt-svc: h3=":443"; ma=86400In het diagram hieronder vergelijk je stap voor stap hoeveel verzoeken er per optie uitgaan en wat er op het scherm verschijnt.
3️⃣ Bestanden downloaden met het curl-commando (-o, -O)
-O slaat het bestand op in de huidige map onder de laatste bestandsnaam uit het adres. Tijdens het opslaan toont het scherm een voortgangsweergave in plaats van de inhoud.
curl -O https://example.com/wp-includes/images/w-logo-blue.png % Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
100 3113 100 3113 0 0 178k 0 --:--:-- --:--:-- --:--:-- 190kls -l w-logo-blue.png-rw-r--r-- 1 root root 3113 Oct 28 14:29 w-logo-blue.pngNa het downloaden stonden [Total] en [Received] in de voortgangsweergave allebei op 3113, en de bestandsgrootte die we met ls -l controleerden, kwam ook overeen: 3.113 bytes.
Wil je de bestandsnaam zelf kiezen, zet die dan achter -o. Hieronder zie je het resultaat van het opslaan van het adres van de startpagina als home.html.
curl -o home.html https://example.com/ % Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
100 96679 0 96679 0 0 4291k 0 --:--:-- --:--:-- --:--:-- 4291kls -l home.html-rw-r--r-- 1 root root 96679 Oct 28 14:29 home.html-O neemt de bestandsnaam aan het eind van het adres ongewijzigd over en past dus niet bij pagina-adressen die op een schuine streep eindigen. Zet je -O bij het adres van de startpagina, dan vindt curl geen bestandsnaam en stopt het met de foutmelding hieronder.
curl -O https://example.com/curl: Remote file name has no length!
curl: (23) Failed writing received data to disk/application4️⃣ POST-verzoeken met curl en JSON-gegevens versturen
Wil je met een verzoek dat tot nu toe alleen las ook gegevens meesturen, gebruik dan -d, en voeg -H toe om het gegevensformaat aan te geven. -d stuurt de gegevens die je erachter schrijft als POST-inhoud. Zonder verdere opgave is de [Content-Type] [application/x-www-form-urlencoded].
Met -d wordt de verzoekmethode POST, dus je kunt [-X POST] weglaten. Ook de officiële documentatie legt uit dat -X meestal niet nodig is.
Stuur je JSON, verander dan met -H de [Content-Type] in [application/json]. Hieronder zie je het resultaat van een verzoek om een bericht aan te maken, zonder authenticatie naar de WordPress REST API gestuurd.
curl -s -X POST -H 'Content-Type: application/json' -d '{"title":"curl test"}' https://example.com/wp-json/wp/v2/posts{"code":"rest_authentication_error","message":"\uc8c4\uc1a1\ud569\ub2c8\ub2e4. REST API \uc694\uccad\uc744 \ud560 \uc218 \uc788\ub294 \uad8c\ud55c\uc774 \uc5c6\uc2b5\ub2c8\ub2e4.","data":{"status":401}}De site waar we het verzoek naartoe stuurden blokkeert REST API-verzoeken van gebruikers die niet zijn ingelogd en daarom gaf code [rest_authentication_error] terug, met status 401. Door dezelfde instelling gaf ook een GET-verzoek voor de berichtenlijst op hetzelfde adres 401 terug. De waarde van message is een foutmelding in de taal van de site, omgezet naar de Unicode-notatie van JSON.
Wil je alleen de statuscode zien, gooi de inhoud dan weg met [-o /dev/null] en toon met -w alleen http_code.
curl -s -o /dev/null -w '%{http_code}\n' -X POST -H 'Content-Type: application/json' -d '{"title":"curl test"}' https://example.com/wp-json/wp/v2/posts4015️⃣ Responstijd meten met het curl-commando (-w)
Bij een traag antwoord kijk je al snel alleen naar total, maar of de tijd in de verbinding of in de verwerking op de server zat, zie je pas als je de tijd per stap apart toont. -w toont na afloop van het verzoek de meetwaarden in het opgegeven formaat. De waarden komen op de plaatsen [%{variabelenaam}] in het formaat.
Gooi de inhoud weg met [-o /dev/null] en verberg de voortgangsweergave met -s.
curl -o /dev/null -s -w 'code: %{http_code}\nconnect: %{time_connect}\ntls: %{time_appconnect}\nttfb: %{time_starttransfer}\ntotal: %{time_total}\n' https://example.com/code: 200
connect: 0.001507
tls: 0.017728
ttfb: 0.021912
total: 0.022825connect is de TCP-verbinding, tls de TLS-onderhandeling, ttfb de tijd tot vlak voordat de eerste byte wordt verzonden en total de tijd tot de overdracht klaar is. Alle vier de waarden zijn seconden, opgeteld vanaf het begin van het verzoek.
Omdat de server waarop curl draaide en de site die het verzoek ontving op dezelfde server stonden, duurde de verbinding maar 0,0015 seconde, was de TLS-onderhandeling klaar na 0,0177 seconde en kwam de eerste byte na 0,0219 seconde. Van het einde van de TLS-onderhandeling tot de aankomst van de eerste byte duurde het ongeveer 0,004 seconde. Volgens de officiële documentatie zit in deze stap de tijd die de server nodig heeft om het resultaat te maken.
Toen we hetzelfde commando nog drie keer uitvoerden, lag total tussen 0,0219 en 0,0226 seconde.
🔲 Simulator voor het curl-commando
In de simulator hieronder typ je de commando's van tot nu toe zelf in en zie je hoe de uitvoer per optie verandert.
🔢 FAQ & aanbevolen content








ℹ️ Affiliatemelding
De content van deze site bevat affiliatelinks. Koopt een bezoeker via een van deze links een product of dienst, dan ontvangt deze site een commissie van de verkoper. Het bedrag dat de koper betaalt (bij acties gaat het omlaag ↓) wordt daardoor niet hoger. De vermelde prijzen, kortingen en voorraad gelden op het moment van schrijven en kunnen afwijken; controleer ze daarom vóór je aankoop bij de verkoper. Producten worden gekozen en beoordeeld volgens onze eigen criteria, en commissies hebben geen invloed op de volgorde of de inhoud van de beoordelingen.