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

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

544 голоса | спросил kdt 18 PMpMon, 18 Apr 2011 14:28:57 +040028Monday 2011, 14:28:57

15 ответов


335

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

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

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

ответил pberlijn 18 PMpMon, 18 Apr 2011 14:56:02 +040056Monday 2011, 14:56:02
611

Более конкретный способ распечатать только код состояния 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/
ответил pvandenberk 28 J0000006Europe/Moscow 2012, 04:25:11
166

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

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
ответил Enrico Susatyo 3 Mayam12 2012, 08:28:44
141

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

curl -i http://example.org

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

ответил Cyril David 5 WedEurope/Moscow2012-12-05T00:45:49+04:00Europe/Moscow12bEurope/MoscowWed, 05 Dec 2012 00:45:49 +0400 2012, 00:45:49
45

Если вы хотите захватить код состояния 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')
ответил Heath Borders 8 Jpm1000000pmThu, 08 Jan 2015 23:59:43 +030015 2015, 23:59:43
25

Переопределить вывод кривого:

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

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

ответил Grzegorz Luczywo 5 PM000000100000002931 2014, 22:18:29
10

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

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

curl -I http://example.org 2>/dev/null | head -n 1 | cut -d$' ' -f2
ответил Filip Spiridonov 15 J000000Wednesday15 2015, 23:08:53
8

Для запроса 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]'
ответил zafar142003 7 Jam1000000amThu, 07 Jan 2016 11:36:07 +030016 2016, 11:36:07
8

Код состояния ТОЛЬКО

[0]$ curl -LI http://www.example.org -o /dev/null -w '%{http_code}\n' -s
[0]$ 200

Все это относится к GIST

ответил mahatmanich 8 FebruaryEurope/MoscowbWed, 08 Feb 2017 13:44:15 +0300000000pmWed, 08 Feb 2017 13:44:15 +030017 2017, 13:44:15
7

Это болезненное ограничение 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 [.

ответил Lucas Cimon 6 PMpWed, 06 Apr 2016 16:08:49 +030008Wednesday 2016, 16:08:49
4
curl -so -i /dev/null -w "%{http_code}"  http://www.any_example.com

Это вернет следующую информацию:

  1. данные ответа, если какие-либо данные возвращаются API, например error
  2. код состояния
ответил srana 8 MaramWed, 08 Mar 2017 08:12:46 +03002017-03-08T08:12:46+03:0008 2017, 08:12:46
3

Вот некоторая команда curl, которая использует GET и возвращает код HTTP.

curl -so /dev/null -w '%{response_code}' http://www.example.org

Пожалуйста, помните, что в приведенном ниже подходе используется HEAD, который работает быстрее, но может не работать с некоторыми HTTP-серверами, не соответствующими HTTP.

 curl -I http://www.example.org
ответил sorin 23 J0000006Europe/Moscow 2016, 13:37:18
2

Используйте следующую команду 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 на стандартный вывод.

ответил Savitoj Singh 21 12016vEurope/Moscow11bEurope/MoscowMon, 21 Nov 2016 14:28:27 +0300 2016, 14:28:27
1

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.

ответил sakumatto 7 +03002017-10-07T10:32:50+03:00312017bEurope/MoscowSat, 07 Oct 2017 10:32:50 +0300 2017, 10:32:50
1

Пример использования кодов ответов. Я использую это для повторной загрузки баз данных 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
ответил Stuart Cardall 1 PMpSun, 01 Apr 2018 20:21:59 +030021Sunday 2018, 20:21:59

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132