Мой способ добиться этого :
Чтобы получить и то, и другое (заголовок и тело), я обычно выполняю следующее curl -D- <url>
:
$ 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"]}
Это сбрасывает headers ( -D
) в stdout ( -
) (ищите --dump-header
в man curl ).
ИМХО тоже очень удобно в этом контексте:
Я часто использую jq для форматирования данных json (например, из некоторых остальных API). Но поскольку jq не ожидает HTTP-заголовка, хитрость заключается в том, чтобы напечатать заголовки в stderr, используя -D/dev/stderr
. Обратите внимание, что на этот раз мы также используем -sS
(--silent, --show-errors) для подавления индикатора выполнения (потому что мы пишем в канал).
$ 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"
]
}
Я думаю, это также может быть удобно, если вы хотите распечатать заголовки (для быстрой проверки) на консоли, но перенаправить тело в файл (например, когда это какой-то двоичный файл, чтобы не испортить ваш терминал):
$ 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
Имейте в виду: это НЕ то же самое, что curl -I <url>
! As -I
будет выполнять HEAD
запрос, а не GET
запрос (ищите --head
в man curl . Да: для большинства HTTP-серверов это даст тот же результат. Но я знаю множество бизнес-приложений, которые вообще не реализуют HEAD
запросы ;-P