Как отобразить заголовки запроса с помощью командной строки curl - PullRequest
477 голосов
/ 15 июля 2010

В командной строке curl может отображаться заголовок ответа с помощью опции -D, но я хочу посмотреть, какой заголовок запроса он отправляет.Как я могу это сделать?

Ответы [ 9 ]

675 голосов
/ 15 июля 2010
Опция

curl -v или --verbose показывает, помимо прочего, заголовки HTTP-запроса.Вот пример вывода:

$ curl -v http://google.com/
* About to connect() to google.com port 80 (#0)
*   Trying 66.102.7.104... connected
* Connected to google.com (66.102.7.104) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.16.4 (i386-apple-darwin9.0) libcurl/7.16.4 OpenSSL/0.9.7l zlib/1.2.3
> Host: google.com
> Accept: */*
> 
< HTTP/1.1 301 Moved Permanently
< Location: http://www.google.com/
< Content-Type: text/html; charset=UTF-8
< Date: Thu, 15 Jul 2010 06:06:52 GMT
< Expires: Sat, 14 Aug 2010 06:06:52 GMT
< Cache-Control: public, max-age=2592000
< Server: gws
< Content-Length: 219
< X-XSS-Protection: 1; mode=block
< 
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/">here</A>.
</BODY></HTML>
* Connection #0 to host google.com left intact
* Closing connection #0
155 голосов
/ 30 октября 2014

Популярный ответ для отображения ответа заголовков, но OP спросил о запросе заголовков.

curl -sD - -o /dev/null http://example.com
  • -s - Избегайте показа индикатора выполнения
  • -D - - Дамп заголовков в файл, но - отправляет его на стандартный вывод
  • -o /dev/null - Игнорировать тело ответа

Это лучше, чем -I, так как он не отправляет запрос HEAD, который может привести к различным результатам.

Это лучше, чем -v, потому что вам не нужно так много хаков-разговорите это.

92 голосов
/ 29 декабря 2012

Я полагаю, что переключатель командной строки, который вы ищете, чтобы передать curl, это -I.

Пример использования:

$ curl -I http://heatmiser.counterhack.com/zone-5-15614E3A-CEA7-4A28-A85A-D688CC418287  
HTTP/1.1 301 Moved Permanently
Date: Sat, 29 Dec 2012 15:22:05 GMT
Server: Apache
Location: http://heatmiser.counterhack.com/zone-5-15614E3A-CEA7-4A28-A85A-D688CC418287/
Content-Type: text/html; charset=iso-8859-1

Кроме того, если вы встретите ответный код состояния HTTP 301, вы можете также передать параметр аргумента -L, чтобы сообщить curl о необходимости перенаправления URL, и в этом случае распечатать заголовки всех страниц (включая перенаправления URL), показанные ниже:

$ curl -I -L http://heatmiser.counterhack.com/zone-5-15614E3A-CEA7-4A28-A85A-D688CC418287
HTTP/1.1 301 Moved Permanently
Date: Sat, 29 Dec 2012 15:22:13 GMT
Server: Apache
Location: http://heatmiser.counterhack.com/zone-5-15614E3A-CEA7-4A28-A85A-D688CC418287/
Content-Type: text/html; charset=iso-8859-1

HTTP/1.1 302 Found
Date: Sat, 29 Dec 2012 15:22:13 GMT
Server: Apache
Set-Cookie: UID=b8c37e33defde51cf91e1e03e51657da
Location: noaccess.php
Content-Type: text/html

HTTP/1.1 200 OK
Date: Sat, 29 Dec 2012 15:22:13 GMT
Server: Apache
Content-Type: text/html
69 голосов
/ 27 мая 2012

Подробный вариант удобен, но если вы хотите увидеть все , которое делает curl (включая передаваемое тело HTTP, а не только заголовки), я предлагаю использовать один из следующих параметров:

  • --trace-ascii - # стандартный вывод
  • --trace-ascii output_file.txt # file
48 голосов
/ 12 августа 2016

Вы получите хороший вывод заголовка с помощью следующей команды:

 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/
*   Trying 2a00: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.1 301 Moved Permanently
< Location: http://www.google.de/
< Content-Type: text/html; charset=UTF-8
< Date: Fri, 12 Aug 2016 15:45:36 GMT
< Expires: Sun, 11 Sep 2016 15: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/'
*   Trying 2a00: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.1 200 OK
< Date: Fri, 12 Aug 2016 15: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-2017 15: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 выводит как исходящие, так и входящие заголовки и пропускает данные bodydata, сообщая вам, насколько велико тело.

Дополнительно для каждой строки указывается направление, чтобы его было легко прочитать. Я нашел особенно полезным отследить длинные цепочки перенаправлений.

6 голосов
/ 23 мая 2014

Мне пришлось самостоятельно преодолевать эту проблему при отладке веб-приложений.-v замечательно, но немного слишком многословно для моих вкусов.Это решение (только для bash), которое я придумал:

curl -v http://example.com/ 2> >(sed '/^*/d')

Это работает, потому что вывод -v отправляется в stderr, а не в stdout.Перенаправив его на подоболочку, мы можем sed удалить строки, начинающиеся с *.Поскольку реальный вывод не проходит через подоболочку, это не затрагивается.Использование subshell немного сложновато, но это самый простой способ перенаправить stderr в другую команду.(Как я уже отметил, я использую это только для тестирования, поэтому он отлично работает для меня.)

3 голосов
/ 27 октября 2014

опция -v для curl слишком многословна в выводе ошибки, который содержит ведущие * (строка состояния) или > (поле заголовка запроса) или < (поле заголовка ответа).чтобы получить только поле заголовка запроса:

curl -v -sS www.stackoverflow.com 2>&1 >/dev/null | grep '>' | cut -c1-2 --complement

, чтобы получить только поле заголовка запроса:

curl -v -sS www.stackoverflow.com 2>&1 >/dev/null | grep '<' | cut -c1-2 --complement

или вывести его в файл /tmp/test.txt с параметром -D

curl -D /tmp/test.txt -sS www.stackoverflow.com > /dev/null

чтобы отфильтровать вывод -v, вы должны направить вывод ошибки на терминал, а вывод std - в / dev / null, опция -s запрещает измерение прогресса

2 голосов
/ 16 января 2019

Команда, подобная приведенной ниже, покажет три раздела: заголовки запроса, заголовки ответа и данные (разделенные CRLF).Он позволяет избежать технической информации и синтаксического шума, добавляемого curl.

curl -vs www.stackoverflow.com 2>&1 | sed '/^* /d; /bytes data]$/d; s/> //; s/< //'

Команда выдаст следующий вывод:

GET / HTTP/1.1
Host: www.stackoverflow.com
User-Agent: curl/7.54.0
Accept: */*

HTTP/1.1 301 Moved Permanently
Content-Type: text/html; charset=UTF-8
Location: https://stackoverflow.com/
Content-Length: 149
Accept-Ranges: bytes
Date: Wed, 16 Jan 2019 20:28:56 GMT
Via: 1.1 varnish
Connection: keep-alive
X-Served-By: cache-bma1622-BMA
X-Cache: MISS
X-Cache-Hits: 0
X-Timer: S1547670537.588756,VS0,VE105
Vary: Fastly-SSL
X-DNS-Prefetch-Control: off
Set-Cookie: prov=e4b211f7-ae13-dad3-9720-167742a5dff8; domain=.stackoverflow.com; expires=Fri, 01-Jan-2055 00:00:00 GMT; path=/; HttpOnly

<head><title>Document Moved</title></head>
<body><h1>Object Moved</h1>This document may be found <a HREF="https://stackoverflow.com/">here</a></body>

Описание:

  • -vs - добавить заголовки (-v), но удалить индикатор выполнения (-s)
  • 2>&1 - объединить stdout и stderr в один стандартный вывод
  • sed - отредактировать ответ, полученный curl, используякоманды ниже
  • /^* /d - удалить строки, начинающиеся с '*' (техническая информация)
  • /bytes data]$/d - удалить строки, заканчивающиеся 'байтами данных]' (техническая информация)
  • s/> // - удалить префикс «>»
  • s/< // - удалить префикс «<» </li>
0 голосов
/ 22 апреля 2018

Если вы хотите больше альтернатив, вы можете попробовать установить HTTP-клиент Modern command, например httpie , который доступен для большинства операционных систем с менеджерами пакетов, такими как brew, apt-get, pip, yum и т. Д.

Например: - Для OSX

brew install httpie

Тогда вы можете использовать в командной строке с различными опциями

http GET https://www.google.com

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...