Получение curl для вывода кода состояния HTTP?
Я использую curl
в командной строке Linux для выдачи HTTP-запросов. Органы реагирования печатаются на стандартную версию, что хорошо, но я не вижу на странице руководства, как получить завиток, чтобы напечатать код состояния HTTP из ответа (404, 403 и т. Д.). Это возможно?
- Кодирование / декодирование заголовков HTTP в Java
- Разница между HTTP и HTTPClient в угловом 4?
- HTTP POST с использованием JSON в Java
- Ошибка API REST возвращает хорошие практики
- Существует ли ограничение длины заголовка HTTP-заголовка?
- HttpClient на Android: NoHttpResponseException через UMTS / 3G
- Почему программное обеспечение веб-сервера запрещает запросы PUT и DELETE?
- Почему говорится, что «HTTP - это протокол без гражданства»?
Это должно работать для вас, если веб-сервер может отвечать на запросы HEAD (это не будет выполнять GET
):
curl -I http://www.example.org
В качестве дополнения, чтобы cURL выполнял переадресацию (статусы 3xx) add -L.
Более конкретный способ распечатать только код состояния 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/
Если вы хотите увидеть заголовок, а также результат, вы можете использовать подробный вариант:
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
Вы можете распечатать код состояния в дополнение ко всем заголовкам, выполнив следующие действия:
curl -i http://example.org
Хорошая вещь о -i
заключается в том, что она работает с -X POST
.
Если вы хотите захватить код состояния HTTP в переменной, но все же перенаправить контент в STDOUT, вы должны создать два STDOUT. Вы можете сделать это с заменой процесса> () и подстановкой команд $ () .
Во-первых, создайте дескриптор файла 3
для вашего текущего процесса «STDOUT с exec 3>&1
.
Затем используйте опцию -o
curl, чтобы перенаправить ответный контент на временный fifo с помощью подстановки команд, а затем в пределах этой подстановки команды перенаправить вывод обратно в ваш текущий дескриптор файла STDOUT процесса с помощью -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')
Переопределить выкручивание:
curl -sw '%{http_code}' http://example.org
Может использоваться с любым типом запроса.
Это отправит запрос на URL-адрес, получит только первую строку ответа, разделит его на блоки и выберите второй.
Он содержит код ответа
curl -I http://example.org 2>/dev/null | head -n 1 | cut -d$' ' -f2
Для запроса POST работало:
curl -w 'RESP_CODE:%{response_code}' -s -X POST --data '{"asda":"asd"}' http://example.com --header "Content-Type:application/json"|grep -o 'RESP_CODE:[1-4][0-9][0-9]'
Это болезненное ограничение на curl --fail
. От man curl
:
-f, –fail (HTTP) Сбой (без вывода вообще) без ошибок на сервере
Но нет способа получить как ненулевой код возврата, так и тело ответа в stdout.
Основываясь на ответе pvandenberk , и этот другой очень полезный трюк, изученный на SO , вот обходной путь:
curl_with_error_code () { _curl_with_error_code "$@" | sed '$d' } _curl_with_error_code () { local curl_error_code http_code exec 17>&1 http_code=$(curl --write-out '\n%{http_code}\n' "$@" | tee /dev/fd/17 | tail -n 1) curl_error_code=$? exec 17>&- if [ $curl_error_code -ne 0 ]; then return $curl_error_code fi if [ $http_code -ge 400 ] && [ $http_code -lt 600 ]; then echo "HTTP $http_code" >&2 return 127 fi }
Эта функция ведет себя точно как curl
, но вернет 127 (код возврата, не используемый curl
) в случае HTTP-кода в диапазоне [400, 600 [.
Только код состояния
[0]$ curl -LI http://www.example.org -o /dev/null -w '%{http_code}\n' -s [0]$ 200
Нашел его на этом GIST
curl -swo -i /dev/null -w "%{http_code}" http://www.any_example.com
Это вернет следующую информацию:
- Данные ответа, если какие-либо данные возвращаются API как ошибка
- Код состояния
Используйте следующую команду cURL и подключите ее к grep следующим образом:
$ Curl -I -s -L http://example.com/v3/get_list | Grep "HTTP / 1.1"
Вот что делает каждый флаг:
-
-I
: показывать только заголовки ответов -
-s
: Silent – не показывать индикатор выполнения -
-L
: Следовать заLocation:
заголовки
Вот ссылка на коды состояния HTTP .
Выполнить из командной строки. Этот завиток работает в бесшумном режиме, следует за любыми переадресациями, получает заголовки HTTP. Grep напечатает код состояния HTTP до стандартного вывода.
Вот некоторая команда curl, которая использует GET
и возвращает код HTTP.
curl -so /dev/null -w '%{response_code}' http://www.example.org
Пожалуйста, помните, что в приведенном ниже подходе используется HEAD
, который работает быстрее, но может не работать с некоторыми веб-серверами, не соответствующими HTTP.
curl -I http://www.example.org