Мій спосіб досягти цього :
Щоб отримати обидва (заголовок і тіло), я зазвичай виконую 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"]}
Це дозволить скинути заголовки ( -D
) до stdout ( -
) (Шукайте --dump-header
в людині curl ).
ІМХО також дуже корисний у цьому контексті:
Я часто використовую jq для отримання даних json (наприклад, від деяких інших API). Але оскільки jq не очікує заголовка HTTP, хитрість полягає в тому, щоб надрукувати заголовки для більш жорсткого використання -D/dev/stderr
. Зверніть увагу, що цього разу ми також використовуємо -sS
(--silent, - show-помилки) для придушення вимірювача прогресу (тому що ми пишемо в трубу).
$ 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>
! Так як -I
буде виконуватися HEAD
запит, а не GET
запит (Шукайте --head
в man curl . Так: для більшості серверів HTTP це дасть такий же результат. Але я знаю багато бізнес-додатків, які взагалі не реалізують HEAD
запит ;-P