Ma façon d'y parvenir :
Pour obtenir les deux (en-tête et corps), j'effectue généralement un curl -D- <url>
comme dans:
$ curl -D- http://localhost:1234/foo
HTTP/1.1 200 OK
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: application/json
Date: Wed, 29 Jul 2020 20:59:21 GMT
{"data":["out.csv"]}
Cela videra les en-têtes ( -D
) dans stdout ( -
) (Cherchez --dump-header
dans man curl ).
IMHO également très pratique dans ce contexte:
J'utilise souvent jq pour mettre en forme ces données json (par exemple à partir de certaines API restantes). Mais comme jq ne s'attend pas à un en-tête HTTP, l'astuce consiste à imprimer les en-têtes vers stderr en utilisant -D/dev/stderr
. Notez que cette fois, nous utilisons également -sS
(--silent, --show-errors) pour supprimer la barre de progression (car nous écrivons dans un tube).
$ curl -sSD/dev/stderr http://localhost:1231/foo | jq .
HTTP/1.1 200 OK
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: application/json
Date: Wed, 29 Jul 2020 21:08:22 GMT
{
"data": [
"out.csv"
]
}
Je suppose que cela peut également être pratique si vous souhaitez imprimer des en-têtes (pour une inspection rapide) sur la console mais rediriger le corps vers un fichier (par exemple, lorsque c'est une sorte de binaire pour ne pas gâcher votre terminal):
$ curl -sSD/dev/stderr http://localhost:1231 > /dev/null
HTTP/1.1 200 OK
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: application/json
Date: Wed, 29 Jul 2020 21:20:02 GMT
Attention: ce n'est PAS la même chose que curl -I <url>
! Comme -I
effectuera une HEAD
requête et non une GET
requête (Cherchez --head
dans man curl . Oui: Pour la plupart des serveurs HTTP, cela donnera le même résultat. Mais je connais beaucoup d'applications métier qui n'implémentent pas du tout la HEAD
requête ;-P