Получение только заголовка ответа из HTTP POST с помощью curl

563

Можно запросить только заголовки, используя HTTP HEAD, как вариант -Iв curl(1).

$ curl -I /

Длинные тела ответов HTML - это боль в командной строке, поэтому я хотел бы получить только заголовок в качестве обратной связи для моих запросов POST. Однако HEAD и POST - это два разных метода.

Как заставить curl отображать только заголовки ответа на POST-запрос?

Джонатан Аллард
источник

Ответы:

774
-D, --dump-header <file>
       Write the protocol headers to the specified file.

       This  option  is handy to use when you want to store the headers
       that a HTTP site sends to you. Cookies from  the  headers  could
       then  be  read  in  a  second  curl  invocation by using the -b,
       --cookie option! The -c, --cookie-jar option is however a better
       way to store cookies.

а также

-S, --show-error
       When used with -s, --silent, it makes curl show an error message if it fails.

а также

-L/--location
      (HTTP/HTTPS) If the server reports that the requested page has moved to a different location (indicated with a Location: header and a 3XX response
      code), this option will make curl redo the request on the new place. If used together with -i/--include or -I/--head, headers from  all  requested
      pages  will  be  shown.  When authentication is used, curl only sends its credentials to the initial host. If a redirect takes curl to a different
      host, it won’t be able to intercept the user+password. See also --location-trusted on how to change this. You can limit the amount of redirects to
      follow by using the --max-redirs option.

      When curl follows a redirect and the request is not a plain GET (for example POST or PUT), it will do the following request with a GET if the HTTP
      response was 301, 302, or 303. If the response code was any other 3xx code, curl will re-send the following  request  using  the  same  unmodified
      method.

со страницы руководства. так

curl -sSL -D - www.acooke.org -o /dev/null

следует перенаправлениям, сбрасывает заголовки в stdout и отправляет данные в / dev / null (это GET, а не POST, но вы можете сделать то же самое с POST - просто добавьте любую опцию, которую вы уже используете для данных POST)

обратите внимание на -после, -Dкоторый указывает, что выходной «файл» является stdout.

Эндрю Кук
источник
22
Приведенный выше комментарий действителен, если вы используете powershell. для использования cmd.execurl -s -D - http://yahoo.com -o nul
JJS
1
@JJS для меня $ null работал на Win7. Это связано с тем, что cLink установлен на Windows.
Сатья Пракаш
17
«-» перед URL может показаться неважным, но это не так.
Вахид Садик
1
@ WahidSadik Почему именно этот случай? Какова функция одиночного тире?
Мамачанко
4
@mamachanko -Dпринимает аргумент, который говорит, куда должен идти вывод. одиночная черточка означает, что она должна идти в стандартный вывод.
Эндрю Кук
172

Другие ответы требуют загрузки тела ответа. Но есть способ сделать запрос POST, который будет получать только заголовок:

curl -s -I -X POST http://www.google.com

-IСам по себе выполняет запрос на головку , которая может быть переопределена -X POSTдля выполнения POST (или любой другой запроса) и все еще получить только данные заголовка.

Сиракуза
источник
15
Этот ответ на самом деле правильный, потому что веб-серверы могут возвращать разные заголовки в зависимости от метода запроса. Если вы хотите проверить заголовки на GET, вы должны использовать запрос GET.
chhantyal
6
Это самый правильный ответ, на мой взгляд. Это легко запомнить, он фактически отправляет GETзапрос и не загружает все тело ответа (или, по крайней мере, не выводит его). -sФлаг не нужен.
скозин
@JeffPuckettII Ну, я бы сказал, что это немного придирчиво. Вы можете заменить GETс POSTв команде выше , и он будет работать , как ожидалось. or any otherключ там.
chhantyal
18
Это не работает, когда вы действительно хотите получить POSTнекоторые данные. Керл говорит:Warning: You can only select one HTTP request method! You asked for both POST Warning: (-d, --data) and HEAD (-I, --head).
СебастьянH
2
@nickboldt Дело в том, что сервер может по-разному отвечать на запрос HEAD, а не на запрос POST или GET (а некоторые серверы на самом деле это делают), поэтому -X HEADздесь нет надежного решения.
Сиракуза
59

Следующая команда отображает дополнительную информацию

curl -X POST http://httpbin.org/post -v > /dev/null

Вы можете попросить сервер отправить только ГОЛОВУ, а не полный ответ

curl -X HEAD -I http://httpbin.org/

Note:В некоторых случаях сервер может отправлять разные заголовки для POST и HEAD. Но почти во всех случаях заголовки одинаковы.

zainengineer
источник
5
К сожалению, другой ответ выиграл, потому что это правильный ответ - он не излишне передает тонну данных.
Даниэль
1
@dmd Если я правильно понимаю руководство по cURL -X, --request, это -X HEADвсе равно приводит к «тонне данных», но есть то, -I, --headчто должно привести к тому, что вы ожидаете.
Даниэль А.Р. Вернер
1
Вы не правильно поняли это. -X HEADи -Iв точности эквивалентны.
Даниэль
18
Проблема -X HEADв том, что сервер может отвечать по-другому, поскольку теперь он получает HEADзапрос вместо GET(или каким бы ни был предыдущий запрос)
Grav
4
Warning: Setting custom HTTP method to HEAD with -X/--request may not work the Warning: way you want. Consider using -I/--head instead.
Дориан
53

Для тел с длительным откликом (и других аналогичных ситуаций) я всегда использую решение по конвейеру less, поэтому

curl -i https://api.github.com/users | less

или

curl -s -D - https://api.github.com/users | less

сделаю работу.

fiatjaf
источник
это не эквивалентно. первый выдает HEADзапрос, на который многие серверы отвечают по-разному. вторая выдает GETзапрос, который больше похож на то, что мы ищем здесь.
glasz
25

Может быть, это немного экстрим, но я использую эту супер короткую версию:

curl -svo. <URL>

Объяснение:

-v выводить отладочную информацию (которая включает заголовки)

-o.отправьте данные веб-страницы (которые мы хотим игнорировать) в определенный файл, .в данном случае, который является каталогом и является недопустимым местом назначения и делает вывод игнорируемым.

-sнет индикатора выполнения, нет информации об ошибке (иначе вы увидите Warning: Failed to create the file .: Is a directory)

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

exebook
источник
1
Зачем использовать -o.вместо -o /dev/null?
bfontaine
@bfontaine -o.используется -o /dev/nullдля краткости
exebook
он не имеет такого поведения, поэтому странно использовать его только для сохранения 8 символов.
bfontaine
2
@bfontaine есть другие ответы, которые показывают, как сделать это наиболее правильным способом, этот здесь, чтобы показать короткую альтернативу, которая делает то же самое в принципе.
exebook
Вы должны уточнить в своем ответе, что эта команда всегда не выполняется. curl -svo. <url> && echo fooне будет печатать , fooпотому что -o.делают curlвозвращать (= ошибка) код ненулевым: curl: (23) Failed writing body.
bfontaine
14

В то время как другие ответы не помогли мне во всех ситуациях, лучшее решение, которое я смог найти (работая POSTтакже), взято отсюда :

curl -vs 'https://some-site.com' 1> /dev/null

Даниэль А.Р. Вернер
источник
1
Я должен был поместить URL между кавычками, чтобы это работало.
Кристоф Вейс
1
Нужно это или нет, может зависеть от URL и используемой оболочки. Я улучшил ответ соответственно. Спасибо.
Даниэль А.Р. Вернер
3

headcurl.cmd (версия для Windows)

curl -sSkv -o NUL %* 2>&1
  • Я не хочу индикатор выполнения -s,
  • но я хочу ошибок -S,
  • не заботясь о действительных сертификатах https -k,
  • получить высокую детализацию -v(речь идет об устранении неполадок, не так ли?),
  • нет выхода (в чистом виде).
  • о, и я хочу перенаправить stderr в stdout , чтобы я мог использовать все (так как большая часть или весь вывод поступает в stderr)
  • %* означает [передать все параметры в этот скрипт] (хорошо ( https://stackoverflow.com/a/980372/444255 ), обычно это всего лишь один параметр: URL, который вы тестируете

Пример из реальной жизни (по устранению неполадок с прокси):

C:\depot>headcurl google.ch | grep -i -e http -e cache
Hostname was NOT found in DNS cache
GET HTTP://google.ch/ HTTP/1.1
HTTP/1.1 301 Moved Permanently
Location: http://www.google.ch/
Cache-Control: public, max-age=2592000
X-Cache: HIT from company.somewhere.ch
X-Cache-Lookup: HIT from company.somewhere.ch:1234

Версия для Linux

для вашего .bash_aliases/ .bash_rc:

alias headcurl='curl -sSkv -o /dev/null $@  2>&1'
Фрэнк Нок
источник
Это загрузит тело и потребит пропускную способность, время. Ответ @siracusa ( stackoverflow.com/a/38679650/6168139 ) не имеет таких издержек.
Руши
Если & когда вы хотите POST, добавьте -X POSTк параметрам passthrough, если вы хотите GET, используйте GET (то есть по умолчанию), поскольку ответы могут отличаться. - Если вы не будете сильно скручивать в производственных сценариях (не для диагностики и разработки), мне не безразлична полоса пропускания.
Фрэнк
Я планирую увидеть, обновляются ли файлы на сервере или нет «Last-Modified». Файлы сами по себе большие, некоторые в ГБ, а я обычно в сотовом интернете. Итак, эта большая пропускная способность является проблемой для меня.
Руши
Это было бы взломано . Мне не нужно этого делать, поскольку ответ Сиракузы выполняет задачу точно.
Руши