Minha maneira de conseguir isso :
Para obter ambos (cabeçalho e corpo), geralmente executo um curl -D- <url>
como em:
$ 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"]}
Isso irá despejar headers ( -D
) em stdout ( -
) (Procure --dump-header
em man curl ).
IMHO também é muito útil neste contexto:
Costumo usar jq para obter os dados json (por exemplo, de algumas APIs restantes) formatados. Mas, como o jq não espera um cabeçalho HTTP, o truque é imprimir os cabeçalhos no stderr usando -D/dev/stderr
. Observe que, desta vez, também usamos -sS
(--silent, --show-errors) para suprimir o medidor de progresso (porque gravamos em um tubo).
$ 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"
]
}
Eu acho que isso também pode ser útil se você quiser imprimir cabeçalhos (para inspeção rápida) para o console, mas redirecionar o corpo para um arquivo (por exemplo, quando é algum tipo de binário para não bagunçar o seu 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
Esteja ciente: NÃO é o mesmo que curl -I <url>
! As -I
executará uma HEAD
solicitação e não uma GET
solicitação (Procure --head
em man curl . Sim: para a maioria dos servidores HTTP, isso produzirá o mesmo resultado. Mas eu conheço muitos aplicativos de negócios que não implementam HEAD
solicitação de forma alguma ;-P