HTTPie : le client HTTP en ligne de commande plus lisible que curl
curl est universel et puissant, mais sa syntaxe est verbeuse et sa sortie est brute. HTTPie est conçu spécifiquement pour les interactions avec des APIs HTTP : syntaxe concise, sortie JSON colorée et indentée automatiquement, gestion des sessions, et authentification simplifiée.
Ce que fait HTTPie
HTTPie est un client HTTP en ligne de commande orienté humain. Il formate et colore automatiquement les réponses JSON, simplifie l’envoi de JSON dans les requêtes, gère les sessions persistantes et les cookies, et fournit une sortie lisible des headers. Disponible aussi en version web et desktop.
Installation
# macOS
brew install httpie
# Windows (pip)
pip install httpie
# Windows (Winget)
winget install HTTPie.HTTPie # version desktop GUI
# Debian / Ubuntu
sudo apt install httpie
# Toutes plateformes via pip
pip install httpie
La commande s’appelle http (et https pour forcer SSL).
Syntaxe de base
# GET simple
http GET https://api.exemple.com/users
# Raccourci : GET est implicite
http https://api.exemple.com/users
# POST avec corps JSON automatique
http POST https://api.exemple.com/users name="Alice" role="admin"
# PUT
http PUT https://api.exemple.com/users/1 name="Alice Dupont"
# DELETE
http DELETE https://api.exemple.com/users/1
Comparaison avec curl
# curl
curl -X POST https://api.exemple.com/login \
-H "Content-Type: application/json" \
-d '{"username": "alice", "password": "secret"}' \
-s | python3 -m json.tool
# HTTPie (équivalent)
http POST https://api.exemple.com/login username=alice password=secret
HTTPie infère Content-Type: application/json et formate la réponse automatiquement.
Types de données dans les requêtes
HTTPie distingue plusieurs types de valeurs selon le séparateur utilisé :
# Chaîne JSON (string)
http POST /api name="Alice"
# Nombre / booléen / null JSON (pas de guillemets)
http POST /api age:=30 active:=true tags:='["dev", "admin"]'
# Fichier JSON brut
http POST /api data:=@config.json
# Form data (multipart)
http --form POST /upload file@photo.jpg name="profil"
# Header personnalisé
http GET /api X-API-Key:mon-token-secret
# Paramètre de query string
http GET /api/users page==2 limit==50
# → /api/users?page=2&limit=50
Authentification
# Basic auth
http -a alice:secret GET https://api.exemple.com/admin
# Bearer token
http GET https://api.exemple.com/me "Authorization: Bearer eyJhbG..."
# Digest auth
http --auth-type=digest -a alice:secret GET https://api.exemple.com/resource
Affichage de la sortie
# Headers de réponse uniquement
http --headers GET https://api.exemple.com/users
# Corps uniquement (pour les pipes)
http --body GET https://api.exemple.com/users
# Headers + corps (défaut)
http GET https://api.exemple.com/users
# Verbose : requête + réponse complètes
http --verbose POST https://api.exemple.com/users name=Alice
# Sortie brute (sans couleur, pour les scripts)
http --print=b https://api.exemple.com/users
Exemple de sortie colorée typique :
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-Id: abc-123
{
"users": [
{
"id": 1,
"name": "Alice",
"role": "admin"
}
],
"total": 1
}
Sessions persistantes
Les sessions conservent les cookies, les headers d’authentification et les variables entre les requêtes :
# Créer / utiliser une session
http --session=dev POST https://api.exemple.com/login username=alice password=secret
# Les cookies de la session sont réutilisés automatiquement
http --session=dev GET https://api.exemple.com/profile
# Lister les sessions
ls ~/.config/httpie/sessions/
Les sessions sont stockées en JSON lisible dans ~/.config/httpie/sessions/.
Fichier de configuration
# ~/.config/httpie/config.toml
default_options = ["--style=dracula", "--check-status"]
--check-status fait échouer le processus (code de sortie non-zéro) si le code HTTP est >= 400, utile dans les scripts.
Intégration dans les scripts
# Vérifier qu'un endpoint répond 200
if http --check-status --quiet GET https://api.exemple.com/health; then
echo "API OK"
else
echo "API KO"
fi
# Extraire un champ de la réponse
TOKEN=$(http POST https://api.exemple.com/auth username=alice password=secret | jq -r .token)
http --session=api GET https://api.exemple.com/users "Authorization: Bearer $TOKEN"
Télécharger des fichiers
# Télécharger avec barre de progression
http --download https://exemple.com/fichier.zip
# Télécharger vers un fichier spécifique
http --download --output rapport.pdf https://exemple.com/rapport.pdf
HTTPS et certificats
# Ignorer la vérification SSL (développement local)
http --verify=no https://localhost:8443/api
# Utiliser un certificat client
http --cert=client.crt --cert-key=client.key GET https://api.exemple.com/secure
Proxy
http --proxy=http:http://proxy.entreprise.com:8080 GET https://api.externe.com
+ Les points forts
- Sortie lisible immédiatement — JSON indenté et coloré sans
| python -m json.toolou| jq - Syntaxe intuitive —
name=valuepour JSON,name==valuepour query string,:=pour les types non-string - Sessions persistantes — tester des workflows multi-étapes sans gérer les tokens manuellement
- Verbose utile —
--verboseaffiche la requête complète avec headers, idéal pour déboguer - Compatible avec les scripts —
--check-statuset--quietpermettent l’intégration dans les pipelines
- Les points faibles
- Moins universel que curl — curl est disponible partout par défaut (Docker, CI, serverless). HTTPie nécessite une installation
- Pas adapté aux binaires — les réponses binaires sont moins bien gérées que curl
- Moins de fonctionnalités réseau bas niveau — pas de support pour les protocoles non-HTTP (FTP, SFTP, SCP)
- Syntaxe différente de curl — les scripts curl existants ne sont pas directement compatibles
HTTPie vs curl vs bruno
| curl | HTTPie | Bruno | |
|---|---|---|---|
| Disponible partout | ✅ | ❌ | ❌ |
| Sortie formatée | ❌ | ✅ | ✅ (GUI) |
| Sessions | ❌ | ✅ | ✅ |
| GUI | ❌ | ✅ (app) | ✅ |
| Scripts shell | ✅ | ✅ | ❌ |
| Collections versionnées | ❌ | ❌ | ✅ |
En résumé
HTTPie est l’outil à garder ouvert pendant le développement d’une API. La lisibilité immédiate de la sortie et la syntaxe concise accélèrent le cycle test-debug-fix. Pour les scripts de production ou les environnements minimalistes, curl reste la référence. Pour les collections versionnées et la collaboration en équipe, Bruno complète mieux HTTPie que curl.
Voir aussi :
- Bruno — organiser les requêtes en collections versionnées dans git
- Hoppscotch — client API complet dans le navigateur
- jq — transformer et filtrer les réponses JSON d’HTTPie