Curl
Le guide de survie

curl
(pour Client URL) est un outil en ligne de commande permettant de faire des requêtes HTTP(S), FTP, SMB, etc. Il est extrêmement utilisé pour tester des API, automatiser des requêtes web, ou encore transférer des fichiers.
Créé par Daniel Stenberg en 1997 (loué soit son nom), curl
est un projet open-source maintenu activement depuis plus de 25 ans. Il est préinstallé sur la plupart des systèmes Unix/Linux et même disponible sur l’OS de Redmond.
Pour en savoir plus sur son créateur, on vous invite à consulter le blog de Daniel Stenberg.
Cheat Sheet curl
Commande | Description |
---|---|
curl http://example.com |
Effectuer une requête GET simple |
curl -L http://example.com |
Suivre les redirections |
curl -I http://example.com |
Afficher uniquement les headers |
curl -X POST http://example.com |
Effectuer une requête POST |
curl -X PUT http://example.com |
Effectuer une requête PUT |
curl -d "param=val" http://... |
Envoyer des données en POST (formulaire) |
curl -H "Header: value" |
Ajouter un en-tête HTTP personnalisé |
curl -u user:pass http://... |
Authentification HTTP Basic |
curl -b cookies.txt http://... |
Envoyer des cookies depuis un fichier |
curl -c cookies.txt http://... |
Sauvegarder les cookies reçus |
curl -F "file=@path" http://... |
Upload de fichier (multipart/form-data) |
curl -o fichier.html http://... |
Sauvegarder la sortie dans un fichier |
curl -O http://site/fichier.zip |
Télécharger un fichier (conserve le nom d’origine) |
curl -s http://... |
Mode silencieux (pas de barre de progression) |
curl -v http://... |
Mode verbeux (affiche les détails de la requête) |
curl --http2 http://... |
Forcer l’utilisation de HTTP/2 |
curl --compressed http://... |
Demander une réponse compressée (gzip, deflate) |
curl --resolve host:port:IP http://... |
Résolution DNS personnalisée (utile pour tester avant changement de DNS) |
curl -k https://... |
Ignorer les erreurs de certificat SSL (⚠️ à éviter en prod !) |
curl -x proxy:port http://... |
Utiliser un proxy |
Astuce : Combine avec jq
pour parser des réponses JSON :
curl -s http://api | jq .
Exemples d’utilisation de curl
Tester une API REST
curl -X GET https://api.github.com/users/octocat
Envoyer des données en POST
curl -X POST https://reqres.in/api/users \
-H "Content-Type: application/json" \
-d '{"name":"Jean","job":"DevOps"}'
Authentification avec token Bearer
curl -H "Authorization: Bearer <token>" https://api.example.com/data
Télécharger un fichier
curl -O https://example.com/fichier.zip
Tester un site avec une IP spécifique (bypass DNS)
curl --resolve example.com:443:192.0.2.123 https://example.com
Upload d’un fichier
curl -F "file=@rapport.pdf" https://upload.example.com
Envoi et réception de cookies
curl -c cookies.txt -b cookies.txt https://example.com
Voir uniquement les en-têtes HTTP
curl -I https://example.com
Suivre les redirections
curl -L https://short.url/vers/longue
Affichage détaillé (debug)
curl -v https://example.com
Mode silencieux (sans sortie)
curl -s https://example.com > /dev/null
Exemples avancés : Requêtes POST
1. POST simple avec JSON et analyse avec jq
curl -s -X POST https://reqres.in/api/users \
-H "Content-Type: application/json" \
-d '{"name": "Jean", "job": "DevOps"}' \
| jq .
Explication :
-s
: mode silencieux-X POST
: méthode HTTP POST-H
: définit un en-tête, iciContent-Type: application/json
-d
: données à envoyer au format JSON| jq .
: formatage de la réponse JSON pour la lisibilité
Réponse typique :
{
"name": "Jean",
"job": "DevOps",
"id": "123",
"createdAt": "2025-04-19T12:34:56.789Z"
}
2. POST avec authentification et token Bearer
curl -s -X POST https://api.example.com/data \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"param1": "value1", "param2": "value2"}' \
| jq '.status, .message'
Explication :
- Ajoute un header d’authentification :
Authorization: Bearer
- Affiche uniquement certains champs de la réponse avec
jq
3. POST multipart (envoi de fichier + champ texte)
curl -s -X POST https://api.example.com/upload \
-F "description=rapport de test" \
-F "file=@rapport.pdf" \
| jq .
Explication :
-F
permet d’envoyer une requêtemultipart/form-data
file=@rapport.pdf
attache un fichier
4. POST avec réponse enregistrée dans un fichier
curl -X POST https://reqres.in/api/users \
-H "Content-Type: application/json" \
-d '{"name":"Alice","job":"Admin"}' \
-o response.json
Explication :
-o response.json
enregistre la sortie dans un fichier
Pour lire la réponse :
cat response.json | jq .
5. POST et extraction conditionnelle de champ
RESPONSE=$(curl -s -X POST https://reqres.in/api/users \
-H "Content-Type: application/json" \
-d '{"name":"Bob","job":"Manager"}')
ID=$(echo "$RESPONSE" | jq -r '.id')
CREATED=$(echo "$RESPONSE" | jq -r '.createdAt')
echo "Utilisateur créé avec ID $ID à $CREATED"
Explication :
- On stocke la réponse dans une variable Bash
- Extraction de champs avec
jq -r
pour une sortie brute - Impression d’un message lisible en shell