Вопрос: Получение curl для вывода кода состояния HTTP?


я использую curl в командной строке Linux для отправки HTTP-запросов. Органы реагирования печатаются по стандарту, что хорошо, но на странице руководства я не вижу, как получить завиток, чтобы напечатать код состояния HTTP из ответа (404, 403 и т. Д.). Это возможно?


553
2018-04-18 10:28


Источник


Что касается меня, я могу видеть из руководства, как получить код состояния HTTP, но опция -w не работает. Я сообщил об ошибке Apple. - Nicolas Barbulesco
-i флаг, как в curl -i https://www.example.com/, вероятно, то, что вы хотите, согласно superuser.com/a/514798/190188 - caw


Ответы:


Это должно сработать для вас если веб-сервер может реагировать на запросы HEAD (это не будет выполнять GET):

curl -I http://www.example.org

В качестве дополнения, чтобы cURL выполнял переадресацию (статусы 3xx) add -L.


343
2018-04-18 10:56



NB: curl -I делает HTTP-запрос HEAD, что может быть проблематичным для проверки кода состояния HTTP для некоторых серверов и служб веб-приложений - Jay Taylor
И чтобы получить только номер статуса, проведите его до head -n 1|cut -d$' ' -f2 - Benubird
Не забудьте переадресовать stderr curl: curl -I http://www.example.org 2>/dev/null | head -n 1 | cut -d$' ' -f2, Добавьте -L в curl, если вам нужен окончательный статус после перенаправления. - Aaron Blenkush
После перенаправления после выполнения запроса HEAD может возникнуть интересное поведение, в зависимости от того, как приложение запрограммировано. - Scott McIntyre
curl -I -X GET отправит запрос GET, но даст тот же результат. - jiggy


Более конкретный способ распечатки просто код состояния HTTP - это что-то вроде следующих:

curl -s -o /dev/null -w "%{http_code}" http://www.example.org/

Гораздо проще работать в скриптах, так как это не требует никакого синтаксического анализа :-)

Параметр -I можно добавить для повышения производительности отклика. Этот параметр просто запрашивает статус / заголовки ответа, без тела ответа загрузки. (% {http_code} возвращает первую строку полезной нагрузки HTTP)

т.е .:

curl -s -o /dev/null -I -w "%{http_code}" http://www.example.org/

619
2018-06-28 00:25



-w "% {http_code}" - это бит, который печатает код состояния. Вы можете добавить новую строку или две, чтобы отделить код от тела (-w "\ n \ n% {http_code} \ n") - Jeffrey Martinez
Вау, это /dev/null вещь даже работает в версии завитки Windows, которую я использую. - Uwe Keim
Я считаю, что это загружает весь файл, даже если все идет в / dev / null, поэтому не идеально подходит для проверки кода состояния для огромных файлов. httping -c 1 -s -G -m выдает GET и не загружает весь файл, хотя я понимаю, что этот вопрос связан с завихрением. - RomanSt
@romkyns, вы правы: первый вариант в моем ответе загружает весь файл и «сохраняет» его /dev/null, но второй вариант - т.е. тот, который использует -I вариант для curl - нет. Однако следует проявлять осторожность, поскольку вы на самом деле не проверяете одно и то же действие: один делает HTTP GET запрос, в то время как другой HEAD запрос ... некоторые веб-серверы / веб-сайты будут отвечать другим кодом состояния, даже если запрошенный URL-адрес точно такой же! - pvandenberk
FYI: -s = Не показывать скорость загрузки, -o /dev/null = не отображать тело, -w "%{http_code}" = Введите код ответа HTTP в stdout после выхода. - Ajedi32


Если вы хотите увидеть заголовок, а также результат, вы можете использовать подробный вариант:

curl -v http://www.example.org
curl --verbose http://www.example.org

Состояние появится в заголовке. Например.

< Date: Tue, 04 Nov 2014 19:12:59 GMT
< Content-Type: application/json; charset=utf-8
< Status: 422 Unprocessable Entity

169
2018-05-03 04:28



+1 для указания флагов подробностей предоставляет дополнительные сведения. Отлично подходит для тестирования приложений REST. - MrOodles
+1 очень прост в использовании при выполнении запроса POST (curl -v --data "...") - MegaTux
Он даже разбивает их на два разных выхода файлов (информация о статусе http для stderr и тела ответа на stdout) - Blauhirn


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

curl -i http://example.org

Хорошая вещь о -i заключается в том, что он работает с -X POST также.


141
2017-12-04 20:45



Гораздо лучше, чем принятый ответ (который выполняет запрос HEAD). - neu242
Возможно, очевидно, но -i работает с Любые HTTP-метод, а не только GET а также POST... :) - mac
лучший ответ, поскольку он делает завиток, выводя как заголовки, так и тело, что делает его подходящим для большинства задач при использовании в скрипте - Sarge Borsch
Это лучший ответ и может использоваться в сочетании с -s (не показывать индикаторы выполнения или сообщения об ошибках) и -S(все-таки показывать сообщения об ошибках) - Jonathan Hartley


Если вы хотите захватить код состояния HTTP в переменной, но все же перенаправить контент в STDOUT, вы должны создать два STDOUT. Вы можете сделать это с помощью замена процесса> () а также подстановка команды $ (),

Сначала создайте дескриптор файла 3 для вашего текущего процесса 'STDOUT с exec 3>&1,

Затем используйте curl's -o возможность перенаправления содержимого ответа на временный fifo с использованием подстановки команд, а затем в рамках этой подстановки команды, перенаправление вывода обратно в ваш текущий дескриптор файла STDOUT процесса 3 с -o >(cat >&3),

Объединяя все это:

#creates a new file descriptor 3 that redirects to 1 (STDOUT)
exec 3>&1 
# Run curl in a separate command, capturing output of -w "%{http_code}" into HTTP_STATUS
# and sending the content to this command's STDOUT with -o >(cat >&3)
HTTP_STATUS=$(curl -w "%{http_code}" -o >(cat >&3) 'http://example.com')

45
2018-01-08 20:59



Это серьезный прокол ... и мне это нравится! - spyle
Теперь, как, в свою очередь, можно перенаправить вывод на другую переменную? - Roger Filmyer
Выходной сигнал STDOUT, поэтому вы должны иметь возможность перенаправлять вывод из команды в любом месте, где вам нравится, как обычная команда. Я не тестировал это. - Heath Borders


Переопределить выкручивание:

curl -sw '%{http_code}' http://example.org

Может использоваться с любым типом запроса.


26
2017-08-05 18:18



-k (--insecure) является переопределяющим -s (беззвучным). - Ravichandra


Это отправит запрос на URL-адрес, получит только первую строку ответа, разделит его на блоки и выберите второй.

Он содержит код ответа

curl -I http://example.org 2>/dev/null | head -n 1 | cut -d$' ' -f2

10
2017-07-15 20:08



Можете ли вы объяснить, что делает этот код и как он решает проблему, заданную OP? Необъяснимый код может оказаться ненадежным и опасным для пользователей. - bwDraco
Конечно, мы отправляем запрос на url, получаем только первую строку ответа, разбиваем его на блоки и выбираем второй. Он содержит код ответа, который ищет OP. - Filip Spiridonov