Il mio modo per ottenere questo risultato :
Per ottenere entrambi (intestazione e corpo), di solito eseguo un curl -D- <url>
come in:
$ 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"]}
Questo scaricherà le intestazioni ( -D
) su stdout ( -
) (Cerca --dump-header
in man curl ).
IMHO anche molto utile in questo contesto:
Uso spesso jq per ottenere la formattazione dei dati json (ad esempio da alcune API rest). Ma poiché jq non si aspetta un'intestazione HTTP, il trucco è stampare le intestazioni su stderr usando -D/dev/stderr
. Nota che questa volta usiamo anche -sS
(--silent, --show-errors) per sopprimere l'indicatore di avanzamento (perché scriviamo su una pipe).
$ 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"
]
}
Immagino che questo possa essere utile anche se desideri stampare le intestazioni (per un'ispezione rapida) sulla console ma reindirizzare il corpo a un file (ad esempio, quando è una specie di binario per non rovinare il tuo terminale):
$ 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
Attenzione: NON è la stessa cosa di curl -I <url>
! Come -I
eseguirà una HEAD
richiesta e non una GET
richiesta (cerca --head
in man curl . Sì: per la maggior parte dei server HTTP questo produrrà lo stesso risultato. Ma conosco molte applicazioni aziendali che non implementano affatto la HEAD
richiesta ;-P