Commandes Linux pour faire des requêtes HTTP, tester des APIs REST et manipuler du JSON.

Sujets associés : API — Vue d’ensemble, API REST, HTTP — Méthodes, Codes et Headers, Requêtes HTTP et HTTPS


curl — couteau suisse HTTP

Requêtes de base

# GET simple
curl https://api.exemple.com/users
 
# GET avec affichage des headers de réponse
curl -i https://api.exemple.com/users        # headers + body
curl -I https://api.exemple.com/users        # headers seulement (HEAD)
curl -v https://api.exemple.com/users        # mode verbeux (tout)
 
# Suivre les redirections
curl -L https://exemple.com
 
# Sauvegarder la réponse dans un fichier
curl -o sortie.json https://api.exemple.com/users
curl -O https://exemple.com/fichier.zip      # nom du fichier distant
 
# Limiter le temps de connexion et de transfert
curl --connect-timeout 5 --max-time 30 https://api.exemple.com

Méthodes HTTP

# POST avec JSON
curl -X POST https://api.exemple.com/users \
    -H "Content-Type: application/json" \
    -d '{"name": "Alice", "email": "alice@exemple.com"}'
 
# POST avec fichier JSON
curl -X POST https://api.exemple.com/users \
    -H "Content-Type: application/json" \
    -d @payload.json
 
# PUT (mise à jour complète)
curl -X PUT https://api.exemple.com/users/42 \
    -H "Content-Type: application/json" \
    -d '{"name": "Alice Updated"}'
 
# PATCH (mise à jour partielle)
curl -X PATCH https://api.exemple.com/users/42 \
    -H "Content-Type: application/json" \
    -d '{"name": "Alice"}'
 
# DELETE
curl -X DELETE https://api.exemple.com/users/42
 
# OPTIONS (CORS preflight)
curl -X OPTIONS https://api.exemple.com/users \
    -H "Origin: https://frontend.exemple.com" \
    -H "Access-Control-Request-Method: POST"

Headers et authentification

# Ajouter des headers personnalisés
curl -H "X-API-Key: mon-token" \
     -H "Accept: application/json" \
     https://api.exemple.com/data
 
# Authentification Bearer (JWT / OAuth2)
curl -H "Authorization: Bearer eyJhbGci..." https://api.exemple.com/me
 
# Authentification Basic
curl -u utilisateur:motdepasse https://api.exemple.com/
curl -H "Authorization: Basic $(echo -n 'user:pass' | base64)" https://api.exemple.com/
 
# Cookie
curl -b "session=abc123" https://api.exemple.com/
curl -c cookies.txt -b cookies.txt https://api.exemple.com/login  # sauvegarder + envoyer
 
# API Key en query param
curl "https://api.exemple.com/data?api_key=montoken"

TLS et certificats

# Ignorer les erreurs de certificat (dev uniquement !)
curl -k https://self-signed.exemple.com
curl --insecure https://self-signed.exemple.com
 
# Spécifier un CA bundle
curl --cacert /etc/ssl/certs/ca-bundle.crt https://api.exemple.com
 
# Client mTLS (certificat client)
curl --cert client.crt --key client.key \
     --cacert ca.crt \
     https://api.exemple.com/
 
# Afficher les détails du certificat TLS
curl -v --head https://api.exemple.com 2>&1 | grep -A 20 "Server certificate"

Proxy

# Via un proxy HTTP
curl -x http://proxy:3128 https://api.exemple.com/
 
# Via un proxy SOCKS5
curl --socks5 proxy:1080 https://api.exemple.com/
 
# Exclure certains domaines du proxy
curl --noproxy "localhost,192.168.1.0/24" -x http://proxy:3128 https://api.exemple.com/

Formatage et débogage

# Formater la sortie avec le code HTTP seulement
curl -s -o /dev/null -w "%{http_code}" https://api.exemple.com/health
 
# Obtenir plusieurs infos de timing
curl -s -o /dev/null -w "
  DNS:          %{time_namelookup}s
  Connexion:    %{time_connect}s
  TLS:          %{time_appconnect}s
  TTFB:         %{time_starttransfer}s
  Total:        %{time_total}s
  Code HTTP:    %{http_code}
" https://api.exemple.com/
 
# Envoyer du JSON et récupérer JSON (en une ligne avec jq)
curl -s -X POST https://api.exemple.com/users \
    -H "Content-Type: application/json" \
    -d '{"name":"Alice"}' | jq .
 
# Passer par un proxy et capturer la réponse
curl -v https://api.exemple.com 2>&1 | tee debug.txt

wget — téléchargement de fichiers

# Télécharger un fichier
wget https://exemple.com/fichier.zip
 
# Télécharger en arrière-plan
wget -b https://exemple.com/gros-fichier.iso
 
# Reprendre un téléchargement interrompu
wget -c https://exemple.com/gros-fichier.iso
 
# Télécharger plusieurs fichiers (liste dans un fichier)
wget -i liste-urls.txt
 
# Miroir d'un site
wget --mirror --convert-links --page-requisites https://exemple.com/
 
# Télécharger via proxy
wget -e "https_proxy=http://proxy:3128" https://exemple.com/fichier
 
# Nom de fichier personnalisé
wget -O mon-fichier.html https://exemple.com/page

jq — manipulation de JSON en ligne de commande

# Formater du JSON brut
echo '{"name":"Alice","age":30}' | jq .
 
# Accéder à un champ
curl -s https://api.exemple.com/users/1 | jq .name
curl -s https://api.exemple.com/users/1 | jq '.address.city'
 
# Accéder à un élément de tableau
curl -s https://api.exemple.com/users | jq '.[0]'
curl -s https://api.exemple.com/users | jq '.[0].name'
 
# Itérer sur un tableau
curl -s https://api.exemple.com/users | jq '.[] | .name'
 
# Filtrer avec condition
curl -s https://api.exemple.com/users | jq '.[] | select(.age > 25)'
 
# Construire un nouvel objet
curl -s https://api.exemple.com/users | jq '.[] | {id: .id, email: .email}'
 
# Extraire un tableau de valeurs
curl -s https://api.exemple.com/users | jq '[.[] | .name]'
 
# Compter les éléments
curl -s https://api.exemple.com/users | jq 'length'
 
# Extraire avec clé dynamique
curl -s https://api.exemple.com/config | jq '.["env-prod"].host'
 
# Pipe jq dans un script
TOKEN=$(curl -s -X POST https://api.exemple.com/login \
    -d '{"user":"alice","pass":"secret"}' | jq -r .token)
curl -H "Authorization: Bearer $TOKEN" https://api.exemple.com/me

Recettes complètes

# Tester une API avec authentification et voir le code HTTP
STATUS=$(curl -s -o /dev/null -w "%{http_code}" \
    -H "Authorization: Bearer $TOKEN" \
    https://api.exemple.com/health)
echo "Status: $STATUS"
 
# Appel en boucle avec retry
for i in {1..5}; do
    STATUS=$(curl -s -o /dev/null -w "%{http_code}" https://api.exemple.com/health)
    [ "$STATUS" = "200" ] && echo "OK" && break
    echo "Tentative $i: status=$STATUS"
    sleep 2
done
 
# Tester CORS depuis la ligne de commande
curl -s -X OPTIONS https://api.exemple.com/resource \
    -H "Origin: https://app.exemple.com" \
    -H "Access-Control-Request-Method: POST" \
    -H "Access-Control-Request-Headers: Content-Type, Authorization" \
    -v 2>&1 | grep "< Access-Control"
 
# Upload d'un fichier (multipart)
curl -X POST https://api.exemple.com/upload \
    -F "file=@/chemin/vers/fichier.pdf" \
    -F "description=Mon document"

En relation avec