Как отобразить заголовки запроса с помощью командной строки curl
568
Заголовок командной строки может отображать заголовок ответа с помощью -Dпараметра, но я хочу посмотреть, какой заголовок запроса он отправляет. Как я могу это сделать?
curl --head http://google.comбудет делать то же самое, что и -Iфлаг :)
Абель Терефе
9
Примечание об использовании --head/ -I: не все серверы одинаково отвечают на HEADзапросы (например, Content-Encodingбудут отсутствовать, если вы пытаетесь проверить, что тело будет сжато), и не все серверы поддерживают HEAD. -vобычно более безопасный выбор.
Прочитайте вопрос - это для заголовков ответов, а не для заголовков запросов
Грэм Стюарт
58
Этот ответ полезен для меня, потому что я также неправильно понял вопрос.
Лиам
2
Эта команда немного отличается для Windows: curl -sD - -o NULL http://example.com
Сергей Власов
2
@SergeyVlasov На самом деле, эквивалент /dev/nullв Windows есть nul, нет null.
Франциско Сарабосо
2
Хотя этот вопрос требует заголовков запросов, Google направляет сюда всех, кто ищет заголовки ответов, поэтому мы все рады, что этот ответ здесь. И этот ответ является лучшим для получения заголовков ответа. Спасибо!!!
biomiker
96
Я полагаю, что переключатель командной строки, который вы ищете, чтобы перейти к curl -I.
Кроме того, если вы встретите код состояния HTTP ответа 301, вы можете также передать -Lпараметр аргумента, чтобы указать, curlчто следует перенаправлять URL-адреса, и, в этом случае, напечатать заголовки всех страниц (включая перенаправления URL-адресов), как показано ниже :
-IВариант показывает ответ заголовки. Вопрос был о запросе заголовков.
Асаф
53
Опция -Iзаставляет curl делать HTTP HEAD, что может изменить ответ от сервера. -vЯ считаю, что лучше использовать переключатель.
2013 г.
1
Если вы попробуете это с чем-то еще, кроме HEADзапроса (например -X POST) и получите «Вы можете выбрать только один HTTP-запрос!» чем stackoverflow.com/questions/286982/… вероятно, поможет вам. Дело в том, что -Iвыполняется HEADзапрос, как acwуказано, и когда ваш curlвызов настроен на повторный вызов, у вас есть два HTTP-запроса в curlвызове ...
flu
7
Это очень неправильный ответ. (Обещаю, что я обычно очень добр к этому.) 1. Это противоположно тому, что просит ОП. 2. Он использует метод запроса HEADвместо GETили POST. 3. Его НИКОГДА не следует использовать, чтобы «просто увидеть заголовки», если только вы не пытаетесь увидеть, как ваш сервер по-разному реагирует на a HEADв отличие от a GET. Это будет то же самое большую часть времени, но не всегда. Чтобы увидеть только заголовки использовать curl -o /dev/null -D /dev/stdout. Это даст ожидаемые результаты в 100% случаев.
Бруно Броноски
79
Опция verbose удобна, но если вы хотите увидеть все, что делает curl (включая передаваемое тело HTTP, а не только заголовки), я предлагаю использовать одну из следующих опций:
Я не думаю, так как он показывает заголовки ответа и тело тоже!
Pmpr
56
Вы получите хороший вывод заголовка с помощью следующей команды:
curl -L -v -s -o /dev/null google.de
-L, --location следовать перенаправлениям
-v, --verbose больше выхода, указывает направление
-s, --silent не показывать индикатор выполнения
-o, --output /dev/null не показывать полученное тело
Или более короткая версия:
curl -Lvso /dev/null google.de
Результаты в:
*Rebuilt URL to: google.de/*Trying2a00:1450:4008:802::2003...*Connected to google.de (2a00:1450:4008:802::2003) port 80(#0)> GET / HTTP/1.1>Host: google.de
>User-Agent: curl/7.43.0>Accept:*/*>< HTTP/1.1301MovedPermanently<Location: http://www.google.de/<Content-Type: text/html; charset=UTF-8<Date:Fri,12Aug201615:45:36 GMT
<Expires:Sun,11Sep201615:45:36 GMT
<Cache-Control: public, max-age=2592000<Server: gws
<Content-Length:218< X-XSS-Protection:1; mode=block
< X-Frame-Options: SAMEORIGIN
<*Ignoring the response-body
{[218 bytes data]*Connection#0 to host google.de left intact*Issue another request to this URL:'http://www.google.de/'*Trying2a00:1450:4008:800::2003...*Connected to www.google.de (2a00:1450:4008:800::2003) port 80(#1)> GET / HTTP/1.1>Host: www.google.de
>User-Agent: curl/7.43.0>Accept:*/*>< HTTP/1.1200 OK
<Date:Fri,12Aug201615:45:36 GMT
<Expires:-1<Cache-Control: private, max-age=0<Content-Type: text/html; charset=ISO-8859-1< P3P: CP="This is not a P3P policy! See https://www.google.com/support/accounts/answer/151657?hl=en for more info."<Server: gws
< X-XSS-Protection:1; mode=block
< X-Frame-Options: SAMEORIGIN
<Set-Cookie: NID=84=Z0WT_INFoDbf_0FIe_uHqzL9mf3DMSQs0mHyTEDAQOGY2sOrQaKVgN2domEw8frXvo4I3x3QVLqCH340HME3t1-6gNu8R-ArecuaneSURXNxSXYMhW2kBIE8Duty-_w7; expires=Sat,11-Feb-201715:45:36 GMT; path=/; domain=.google.de;HttpOnly<Accept-Ranges: none
<Vary:Accept-Encoding<Transfer-Encoding: chunked
<{[11080 bytes data]*Connection#1 to host www.google.de left intact
Как вы видете curl выводятся как исходящие, так и входящие заголовки, а также пропускаются телоданные, сообщающие вам, насколько велико тело.
Дополнительно для каждой строки указывается направление, чтобы его было легко прочитать. Я нашел особенно полезным отследить длинные цепочки перенаправлений.
Мне нравится это лучше, чем -vвариант с более высокими голосами. Кроме того, просто для краткости, это также может быть curl -Lvso /dev/null <target>до тех пор, пока oприходит в конце.
визг
12
Команда, подобная приведенной ниже, покажет три раздела: заголовки запроса, заголовки ответа и данные (разделенные CRLF). Это позволяет избежать технической информации и синтаксического шума, добавляемого скручиванием.
Мне пришлось самостоятельно преодолевать эту проблему при отладке веб-приложений. -vэто здорово, но слишком многословно для моих вкусов. Это решение (только для bash), которое я придумал:
curl -v http://example.com/ 2> >(sed '/^*/d')
Это работает, потому что выходные данные -vотправляются в stderr, а не в stdout. Перенаправив это на подоболочку, мы можем sedудалить строки, начинающиеся с *. Поскольку реальный вывод не проходит через подоболочку, это не затрагивается. Использование subshell немного сложновато, но это самый простой способ перенаправить stderr в другую команду. (Как я уже отметил, я использую это только для тестирования, поэтому он отлично работает для меня.)
опция -v для curl слишком многословна в выводе ошибки, который содержит ведущий *(строка состояния) или >(поле заголовка запроса) или <(поле заголовка ответа). получить только поле заголовка запроса:
Если вы хотите больше альтернатив, вы можете попробовать установить HTTP-клиент Modern command line, например httpie который доступен для большинства операционных систем с менеджерами пакетов, такими как brew, apt-get, pip, yum и т. Д.
например: - для OSX
brew install httpie
Затем вы можете использовать его в командной строке с различными параметрами
curl --head http://google.com
будет делать то же самое, что и-I
флаг :)--head
/-I
: не все серверы одинаково отвечают наHEAD
запросы (например,Content-Encoding
будут отсутствовать, если вы пытаетесь проверить, что тело будет сжато), и не все серверы поддерживаютHEAD
.-v
обычно более безопасный выбор.Ответы:
curl
-v
или--verbose
опция показывает заголовки HTTP-запроса, между прочим. Вот пример вывода:источник
Популярный ответ для отображения заголовков ответов , но OP спросил о заголовках запросов .
-s
: Не показывать индикатор выполнения-D -
: Дамп заголовки в файл, но-
отправляет его на стандартный вывод-o /dev/null
: Игнорировать тело ответаЭто лучше, чем
-I
когда он не отправляетHEAD
запрос, который может дать разные результаты.Это лучше, чем
-v
потому, что вам не нужно так много хаков, чтобы лишать его многословия.источник
curl -sD - -o NULL http://example.com
/dev/null
в Windows естьnul
, нетnull
.Я полагаю, что переключатель командной строки, который вы ищете, чтобы перейти к curl
-I
.Пример использования:
Кроме того, если вы встретите код состояния HTTP ответа 301, вы можете также передать
-L
параметр аргумента, чтобы указать,curl
что следует перенаправлять URL-адреса, и, в этом случае, напечатать заголовки всех страниц (включая перенаправления URL-адресов), как показано ниже :источник
-I
Вариант показывает ответ заголовки. Вопрос был о запросе заголовков.-I
заставляет curl делатьHTTP HEAD
, что может изменить ответ от сервера.-v
Я считаю, что лучше использовать переключатель.HEAD
запроса (например-X POST
) и получите «Вы можете выбрать только один HTTP-запрос!» чем stackoverflow.com/questions/286982/… вероятно, поможет вам. Дело в том, что-I
выполняетсяHEAD
запрос, какacw
указано, и когда вашcurl
вызов настроен на повторный вызов, у вас есть два HTTP-запроса вcurl
вызове ...HEAD
вместоGET
илиPOST
. 3. Его НИКОГДА не следует использовать, чтобы «просто увидеть заголовки», если только вы не пытаетесь увидеть, как ваш сервер по-разному реагирует на aHEAD
в отличие от aGET
. Это будет то же самое большую часть времени, но не всегда. Чтобы увидеть только заголовки использоватьcurl -o /dev/null -D /dev/stdout
. Это даст ожидаемые результаты в 100% случаев.Опция verbose удобна, но если вы хотите увидеть все, что делает curl (включая передаваемое тело HTTP, а не только заголовки), я предлагаю использовать одну из следующих опций:
--trace-ascii -
# stdout--trace-ascii output_file.txt
# файлисточник
Вы получите хороший вывод заголовка с помощью следующей команды:
-L, --location
следовать перенаправлениям-v, --verbose
больше выхода, указывает направление-s, --silent
не показывать индикатор выполнения-o, --output /dev/null
не показывать полученное телоИли более короткая версия:
Результаты в:
Как вы видете
curl
выводятся как исходящие, так и входящие заголовки, а также пропускаются телоданные, сообщающие вам, насколько велико тело.Дополнительно для каждой строки указывается направление, чтобы его было легко прочитать. Я нашел особенно полезным отследить длинные цепочки перенаправлений.
источник
-v
вариант с более высокими голосами. Кроме того, просто для краткости, это также может бытьcurl -Lvso /dev/null <target>
до тех пор, покаo
приходит в конце.Команда, подобная приведенной ниже, покажет три раздела: заголовки запроса, заголовки ответа и данные (разделенные CRLF). Это позволяет избежать технической информации и синтаксического шума, добавляемого скручиванием.
Команда выдаст следующий вывод:
Описание:
-vs
- добавить заголовки (-v), но удалить индикатор выполнения (-s)2>&1
- объединить стандартный вывод и стандартный вывод в один стандартный выводsed
- отредактируйте ответ, полученный curl, используя команды ниже/^* /d
- удалить строки, начинающиеся с '*' (техническая информация)/bytes data]$/d
- удалить строки, заканчивающиеся на «байтовые данные]» (техническая информация)s/> //
- удалить префикс '>'s/< //
- удалить префикс «<»источник
Мне пришлось самостоятельно преодолевать эту проблему при отладке веб-приложений.
-v
это здорово, но слишком многословно для моих вкусов. Это решение (только для bash), которое я придумал:Это работает, потому что выходные данные
-v
отправляются в stderr, а не в stdout. Перенаправив это на подоболочку, мы можемsed
удалить строки, начинающиеся с*
. Поскольку реальный вывод не проходит через подоболочку, это не затрагивается. Использование subshell немного сложновато, но это самый простой способ перенаправить stderr в другую команду. (Как я уже отметил, я использую это только для тестирования, поэтому он отлично работает для меня.)источник
опция -v для curl слишком многословна в выводе ошибки, который содержит ведущий
*
(строка состояния) или>
(поле заголовка запроса) или<
(поле заголовка ответа). получить только поле заголовка запроса:получить только поле заголовка запроса:
или выгрузить его в
/tmp/test.txt
файл с опцией -Dчтобы отфильтровать
-v
вывод, вы должны направить вывод ошибки на терминал, а вывод std - в / dev / null, опция -s запрещает измерение прогрессаисточник
Если вы хотите больше альтернатив, вы можете попробовать установить HTTP-клиент Modern command line, например httpie который доступен для большинства операционных систем с менеджерами пакетов, такими как brew, apt-get, pip, yum и т. Д.
например: - для OSX
Затем вы можете использовать его в командной строке с различными параметрами
источник