Mein Weg, um dies zu erreichen :
Um beides zu bekommen (Header und Body), führe ich normalerweise ein curl -D- <url>
wie 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"]}
Dadurch werden die Header ( -D
) an stdout ( -
) ausgegeben ( --dump-header
in man curl suchen ).
IMHO auch in diesem Zusammenhang sehr praktisch:
Ich benutze oft jq , um diese json-Daten (z. B. von einigen Rest-APIs) zu formatieren. Da jq jedoch keinen HTTP-Header erwartet, besteht der Trick darin, Header mit stderr zu drucken -D/dev/stderr
. Beachten Sie, dass wir diesmal auch -sS
(--silent, --show-error) verwenden, um die Fortschrittsanzeige zu unterdrücken (weil wir in eine Pipe schreiben).
$ 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"
]
}
Ich denke, dies kann auch nützlich sein, wenn Sie Header (zur schnellen Überprüfung) auf die Konsole drucken möchten, aber den Textkörper in eine Datei umleiten möchten (z. B. wenn es sich um eine Art Binärdatei handelt, um Ihr Terminal nicht durcheinander zu bringen):
$ 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
Beachten Sie: Dies ist NICHT das gleiche wie curl -I <url>
! As -I
führt eine HEAD
Anforderung und keine GET
Anforderung aus (Suchen Sie nach --head
in man curl . Ja: Bei den meisten HTTP-Servern führt dies zum gleichen Ergebnis. Ich kenne jedoch viele Geschäftsanwendungen, die überhaupt keine HEAD
Anforderung implementieren