Отримання лише заголовка відповіді від HTTP POST за допомогою curl


561

Можна запросити лише заголовки, використовуючи HTTP HEAD, як опцію -Iв curl(1).

$ curl -I /

Тривалі органи відповідей HTML - це біль отримати командний рядок, тому я хотів би отримати лише заголовок як зворотній зв'язок для моїх POST-запитів. Однак HEAD і POST - це два різні методи.

Як змусити curl відображати лише заголовки відповідей на запит POST?

Відповіді:


773
-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.

зі сторінки man. тому

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

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

зауважте -після цього, -Dякий вказує на те, що вихідний "файл" є stdout.


22
вище коментар є дійсним, якщо ви використовуєте powershell. для використання cmd.execurl -s -D - http://yahoo.com -o nul
JJS

1
@JJS для мене $ null працював на Win7. Це пов’язано із встановленою на Windows віком cLink.
Сатья Пракаш

17
"-" перед URL-адресою може здатися неважливим, але це не так.
Вахід Садік

1
@WahidSadik Чому це саме так? Яка функція одиночного тире?
мамачанко

4
@mamachanko -Dприймає аргумент, який говорить, куди має йти вихід. один тире означає, що він повинен переходити до stdout.
andrew cooke

172

Інші відповіді вимагають завантаження органу відповіді. Але є спосіб зробити запит POST, який отримає лише заголовок:

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

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


15
Ця відповідь насправді правильна, оскільки веб-сервери можуть повертати різні заголовки на основі методу запиту. Якщо ви хочете перевірити заголовки в GET, вам потрібно скористатися GET-запитом.
chhantyal

6
Це, на мою думку, найбільш правильна відповідь. Це легко запам’ятати, він фактично надсилає GETзапит і не завантажує все тіло відповідей (або принаймні не видає його). -sПрапор не потрібен.
skozin

@JeffPuckettII добре, я ніби сказав. Ви можете замінити GETз POSTв команді вище , і він буде працювати , як очікувалося. or any otherє ключовим там.
chhantyal

18
Це не спрацьовує, коли ви хочете отримати POSTдеякі дані. Curl каже: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тут немає надійного рішення.
siracusa

58

Наступна команда відображає додаткову інформацію

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

Ви можете попросити сервер надіслати лише HEAD, а не повну відповідь

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

Note:У деяких випадках сервер може надсилати різні заголовки для пошти та HEAD. Але майже у всіх випадках заголовки однакові.


5
Прикро, що виграла інша відповідь, адже це правильна відповідь - вона не надмірно передає тону даних.
Даніель

1
@dmd Якщо я -X, --requestправильно зрозумів посібник CURL , він -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

зробить роботу.


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

25

Можливо, це є трохи крайнім, але я використовую цю суперкоротку версію:

curl -svo. <URL>

Пояснення:

-v друкувати інформацію про налагодження (що включає заголовки)

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

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

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


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до параметрів проходження, якщо ви хочете GET, використовуйте GET (тобто за замовчуванням), оскільки відповіді можуть відрізнятися. - Якщо ви не зробите важкі керлінг у виробничих сценаріях (не для діагностики та розвитку), я не переймаюся трохи пропускної здатності.
Френк

Я планую це, щоб побачити, чи файли на сервері оновлюються чи не використовуються "Last-Modified". Файли самі по собі великі, деякі - в ГБ, а я, як правило, в мобільному Інтернеті. Отже, ця велика пропускна здатність є проблемою для мене.
руші

Це було б хакі . Мені не потрібно , щоб зробити це , як Сіракузи відповіді виконує завдання точно.
руші
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.