Depuis quelques années, curl est devenu le programme que j’utilise le plus (après mes butineurs). Dans un monde où les APIs sont omni-présentes, c’est un portail vers l’infini et l’au-delà ! Il permet de faire des recherches, de télécharger des fichiers, de construire une infrastructure, d’envoyer des SMS, d’insérer des données dans une base, de livrer une application, d’exécuter du code, de se téléporter (pour attraper les pokémons régionaux), etc…

Même s’il est assez simple d’utilisation, il lui manque un petit côté user friendly. Pour cela, il existe HTTPie. Ecrit en Python, il simplifie les commandes et surtout met en forme l’affichage.

Comparons le rendu entre cURL et HTTPie :

Avec une option en moins, de la coloration et de l’indentation, HTTPie offre une expérience utilisateur bien plus agréable. Notez également que curl ne force pas le retour à la ligne à la fin (ce qui semble normal). Ceci implique que l’invite de commande du terminal se retrouve un peu n’importe où..

La simplification est plus évidente avec un POST :

La coloration est efficace et fait son petit effet. Mais c’est aussi la réduction du nombre d’arguments qui est plutôt appréciable 1.

Installation

Maintenant que vous avez envie de l’essayer, passons à l’installation. En prérequis, il faut Python et pip. Puis il suffit d’exécuter cette commande :

$ pip install -U httpie
Collecting httpie
  Downloading httpie-0.9.9-py2.py3-none-any.whl (74kB)
    100% |████████████████████████████████| 81kB 2.6MB/s
Collecting requests>=2.11.0 (from httpie)
  Downloading requests-2.18.1-py2.py3-none-any.whl (88kB)
    100% |████████████████████████████████| 92kB 3.4MB/s
Collecting Pygments>=2.1.3 (from httpie)
  Downloading Pygments-2.2.0-py2.py3-none-any.whl (841kB)
    100% |████████████████████████████████| 849kB 1.1MB/s
Collecting colorama>=0.2.4; sys_platform == "win32" (from httpie)
  Downloading colorama-0.3.9-py2.py3-none-any.whl
Collecting chardet<3.1.0,>=3.0.2 (from requests>=2.11.0->httpie)
  Downloading chardet-3.0.4-py2.py3-none-any.whl (133kB)
    100% |████████████████████████████████| 143kB 1.6MB/s
Collecting urllib3<1.22,>=1.21.1 (from requests>=2.11.0->httpie)
  Downloading urllib3-1.21.1-py2.py3-none-any.whl (131kB)
    100% |████████████████████████████████| 133kB 3.0MB/s
Collecting certifi>=2017.4.17 (from requests>=2.11.0->httpie)
  Downloading certifi-2017.4.17-py2.py3-none-any.whl (375kB)
    100% |████████████████████████████████| 378kB 1.7MB/s
Collecting idna<2.6,>=2.5 (from requests>=2.11.0->httpie)
  Downloading idna-2.5-py2.py3-none-any.whl (55kB)
    100% |████████████████████████████████| 61kB 4.4MB/s
Installing collected packages: chardet, urllib3, certifi, idna, requests, Pygments, colorama, httpie
Successfully installed Pygments-2.2.0 certifi-2017.4.17 chardet-3.0.4 colorama-0.3.9 httpie-0.9.9 idna-2.5 requests-2.18.1 urllib3-1.21.1

Authentification

Si vous utilisez souvant des APIs avec un système d’authentification (Basic, Digest ou OAuth1), il existe un plugin très pratique et qui s’installe tout aussi facilement :

$ pip install httpie-oauth
Collecting httpie-oauth
  Downloading httpie-oauth-1.0.2.tar.gz
Requirement already satisfied: httpie>=0.7.0 in c:\program files (x86)\python36-32\lib\site-packages (from httpie-oauth)
Collecting requests-oauthlib>=0.3.2 (from httpie-oauth)
  Downloading requests_oauthlib-0.8.0-py2.py3-none-any.whl
Requirement already satisfied: colorama>=0.2.4; sys_platform == "win32" in c:\program files (x86)\python36-32\lib\site-packages (from httpie>=0.7.0->httpie-oauth)
Requirement already satisfied: Pygments>=2.1.3 in c:\program files (x86)\python36-32\lib\site-packages (from httpie>=0.7.0->httpie-oauth)
Requirement already satisfied: requests>=2.11.0 in c:\program files (x86)\python36-32\lib\site-packages (from httpie>=0.7.0->httpie-oauth)
Collecting oauthlib>=0.6.2 (from requests-oauthlib>=0.3.2->httpie-oauth)
  Downloading oauthlib-2.0.2.tar.gz (125kB)
    100% |████████████████████████████████| 133kB 2.1MB/s
Requirement already satisfied: chardet<3.1.0,>=3.0.2 in c:\program files (x86)\python36-32\lib\site-packages (from requests>=2.11.0->httpie>=0.7.0->httpie-oauth)
Requirement already satisfied: idna<2.6,>=2.5 in c:\program files (x86)\python36-32\lib\site-packages (from requests>=2.11.0->httpie>=0.7.0->httpie-oauth)
Requirement already satisfied: urllib3<1.22,>=1.21.1 in c:\program files (x86)\python36-32\lib\site-packages (from requests>=2.11.0->httpie>=0.7.0->httpie-oauth)
Requirement already satisfied: certifi>=2017.4.17 in c:\program files (x86)\python36-32\lib\site-packages (from requests>=2.11.0->httpie>=0.7.0->httpie-oauth)
Installing collected packages: oauthlib, requests-oauthlib, httpie-oauth
  Running setup.py install for oauthlib ... done
  Running setup.py install for httpie-oauth ... done
Successfully installed httpie-oauth-1.0.2 oauthlib-2.0.2 requests-oauthlib-0.8.0

Une fois installé, il suffit de fournir les identifiants à la première requête et fournir un nom de session. Ensuite, pour chaque appel, il faudra fournir le nom de la session :

$ http --session=logged-in --auth-type=basic --auth=login:password https://api.mycompany.com/v1/ressources
$ http --session=logged-in 'https://api.mycompany.com/v1/ressources/1337'

Conclusion

Alors ? cURL ou HTTPie ? Le premier permet de mieux contrôler le comportement du client HTTP 2. Ce qui en fait l’outil adapté pour les scripts. Le second offre une meilleure productivité et une meilleure expérience utilisateur.

Ayant l’habitude de curl, je ne sais pas si j’utiliserai seulement HTTPie maintenant. Néanmoins, je pense que c’est l’outil à choisir pour les démonstrations. 😉

  1. HTTPie propose de nombreuses simplifications comme la détection automatique du Content-Type du Payload lors d’un POST/PUT.
  2. Plus d’options, pas de modification du retour HTTP,…