Получение curl для вывода кода состояния HTTP?
Я использую curl
в командной строке Linux для отправки HTTP-запросов. Органы реагирования печатаются по стандарту, что хорошо, но на странице руководства я не вижу, как получить завиток, чтобы напечатать код состояния HTTP из ответа (404, 403 и т. Д.). Возможно ли это?
15 ответов
Это должно работать для вас , если веб-сервер может отвечать на запросы 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-дескриптор файла 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')
Переопределить вывод кривого:
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]'
Код состояния ТОЛЬКО
[0]$ curl -LI http://www.example.org -o /dev/null -w '%{http_code}\n' -s
[0]$ 200
Все это относится к GIST
Это болезненное ограничение curl --fail
. Из man curl
:
-f, --fail (HTTP) Сбой (без вывода на выходе) без ошибок на сервере
Но нет способа получить как ненулевой код возврата И тело ответа в стандартном режиме.
На основе ответа pvandenberk и этот другой очень полезный трюк, извлеченный в SO , вот обходной путь:
curl_with_error_code () {
_curl_with_error_code "[email protected]" | sed '$d'
}
_curl_with_error_code () {
local curl_error_code http_code
exec 17>&1
http_code=$(curl --write-out '\n%{http_code}\n' "[email protected]" | 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 [.
curl -so -i /dev/null -w "%{http_code}" http://www.any_example.com
Это вернет следующую информацию:
- данные ответа, если какие-либо данные возвращаются API, например error
- код состояния
Вот некоторая команда curl, которая использует GET
и возвращает код HTTP.
curl -so /dev/null -w '%{response_code}' http://www.example.org
Пожалуйста, помните, что в приведенном ниже подходе используется HEAD
, который работает быстрее, но может не работать с некоторыми HTTP-серверами, не соответствующими HTTP.
curl -I http://www.example.org
Используйте следующую команду 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 на стандартный вывод.
OP хочет знать код состояния. Часто при загрузке файла вы также хотите почувствовать его размер, поэтому сначала я использую curl, чтобы показать код состояния и размер файла, а затем отключить подробный и прямой файл в нужное место и имя:
curl -R -s -S -w "\nhttp: %{http_code} %{size_download}\n" -o /Users/myfiles/the_local_name.html http://archive.onweb.com/the_online_name.html
Затем я жду окончания финиша
wait ${!}
, прежде чем запустить следующую команду. Вышеприведенное при использовании в скрипте многих команд, подобных приведенным выше, дает хороший ответ вроде:
http: 200 42824
http: 200 34728
http: 200 35452
Обратите внимание, что в-cur в curl должен следовать полный путь к файлу + имя файла. Это позволяет вам, таким образом, сохранять файлы в разумной структуре имен, когда вы d /l их с curl. Также обратите внимание, что -s и -S, используемые вместе, отключают вывод, но показывают ошибки. Также обратите внимание, что -R пытается установить временную метку файла в файл веб-файла.
Мой ответ основан на том, что первоначально предлагал @pvandenberk, но, кроме того, он фактически сохраняет файл где-то, а не просто направляет /dev /null.
Пример использования кодов ответов. Я использую это для повторной загрузки баз данных Geolite только в том случае, если они были изменены (-z
) & также следующие перенаправления (-L
):
url=http://example.com/file.gz
file=$(basename $url)
response=$(curl -L -s -o $file -z $file $url -w "%{http_code}")
case "$response" in
200) do_something ;;
301) do_something ;;
304) printf "Received: HTTP $response (file unchanged) ==> $url\n" ;;
404) printf "Received: HTTP $response (file not found) ==> $url\n" ;;
*) printf "Received: HTTP $response ==> $url\n" ;;
esac