cURL подавляет реакцию тела
Можно ли поручить cURL подавить вывод тела ответа?
В моем случае тело ответа - это HTML-страница, которая переполняет буфер CLI, что затрудняет поиск соответствующей информации. Я хочу изучить другие части вывода, такие как код ответа HTTP, заголовки и т. Д. - все, кроме фактического HTML.
6 ответов
Вы можете использовать -o
переключатель и null
псевдо-файл:
Юникс
curl -s -o /dev/null -v http://google.com
Windows
curl -s -o nul -v http://google.com
Вот способ подавить все выходные данные и заголовки curl, с возможностью по-прежнему показывать ошибки в случае их возникновения. Полезно для задач cron или автоматического тестирования.
Юникс
Чтобы подавить весь вывод:
curl --silent --output /dev/null http://example.com
Чтобы подавить вывод, но все равно показать ошибки, если они возникают:
curl --silent --output /dev/null --show-error --fail http://example.com
Windows
Чтобы подавить весь вывод:
curl --silent --output nul http://example.com
Чтобы подавить вывод, но все равно показать ошибки, если они возникают:
curl --silent --output nul --show-error --fail http://example.com
Объясненные параметры
--silent
подавляет статистику загрузки в процессе (но все равно будет отображать вывод HTML)--output /dev/null
скрывает успешный вывод--show-error
показывает ошибки, даже когда silent
режим включен--fail
выдаст ошибку, если ответ HTTP - это код ошибки (404, 500 и т. д.), а не просто ошибки DNS/TCP.
ОБНОВЛЕНИЕ: я понимаю, что первоначальный автор хотел проверить заголовки и код ответа на запрос, а не заглушать все. Смотрите ответ Самаэля, чтобы узнать, как это сделать.
Если вы хотите показать заголовки, но скрыть тело ответа, вы захотите использовать:
curl -sIXGET http://somedomain.com/your/url
Я использовал curl -I http://somedomain.com/your/url
только для показа заголовков ответа. Проблема в том, что он делает запрос, используя HEAD
метод, который не годится, когда вы хотите проверить вызов API, который отвечает только на GET
запрос. Это то, что -X GET
для, он изменяет запрос на GET
,
Итак, в итоге:
-s
скрывает индикаторы выполнения от вывода (особенно полезно при передаче в другую программу)-I
показывает заголовки (но делает HEAD
запрос)-XGET
преобразует запрос обратно в GET
запрос
см.: http://www.woolie.co.uk/article/curl-full-get-request-dropping-body/
Просто сделайте запрос HEAD. Вы получите заголовки без тела. Сервер, совместимый со стандартами, должен отправлять сюда точно такую же информацию, как и в запросе GET.
curl --head <url>
Если запрос HEAD не работает для вас по какой-либо причине, это заставит cURL получать и печатать код ответа и заголовки, а затем разрывать соединение, даже не получая тела ответа - в отличие от других ответов, которые получают, а затем отбрасывают его. Это может сэкономить много времени и трафика, особенно если корпус очень большой.
curl --head -X GET <url>
Другой вариант, чтобы показать заголовки ответа и подавить тело:
curl -sD - https://example.com -o /dev/null
Я бы предложил следующее решение:
curl -sS -i https://example.com | perl -e '$p = 1; while(<STDIN>){ $p = 0 if $_ =~ /^\s*$/; print if $p }'
Это длинный однострочник, но он делает то, что вам нужно:
- тело подавлено
- заголовки и коды ответов выводятся @ stdout, так что вы также можете передать информацию другой команде или записать ее в переменную оболочки, например
output="$(curl -i ....)"
- любые ошибки cURL отправляются @ stderr
- это работает как для запросов GET, так и для POST, а также для любых других методов HTTP-запроса, и вы можете использовать другой стандарт
curl
аргументы