Curl

Le guide de survie

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.

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, ici Content-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ête multipart/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