02- Curl
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.
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
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 :
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