2011-04-18 10:28:57 +0000 2011-04-18 10:28:57 +0000
864
864

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

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

Ответы (16)

906
906
906
2012-06-28 00:25:11 +0000

Более конкретный способ распечатки just код состояния HTTP что-то вроде:

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

Гораздо проще работать со скриптами, так как он не требует никакого разбора :-)

Параметр -I может быть добавлен для улучшения производительности ответной нагрузки. Этот параметр просто запрашивает статус/заголовки ответа, без загрузки тела ответа.

Note: %{http_code} возвращает на первой строке HTTP полезную нагрузку

т.е.:

curl -s -o /dev/null -I -w "%{http_code}" http://www.example.org/
572
572
572
2011-04-18 10:56:02 +0000

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

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

Как дополнение, чтобы позволить cURL следовать redirects (3xx статусов) добавьте -L.

237
237
237
2012-05-03 04:28:44 +0000

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

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
218
218
218
2012-12-04 20:45:49 +0000

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

curl -i http://example.org

Хорошо, что -i также работает с -X POST.

71
71
71
2015-01-08 20:59:43 +0000

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

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

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

Складываем все вместе в bash 3.2.57(1)-release (стандарт для macOS):

# 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')

Обратите внимание, что это не работает в /bin/sh как SamK отмечено в комментариях ниже .

35
35
35
2014-08-05 18:18:29 +0000

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

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

Могут быть использованы с любым типом запроса.

19
19
19
2017-02-08 10:44:15 +0000

Код статуса ОДИНСТВЕННО

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

Весь кредит на это ГИСТ

14
14
14
2016-04-06 13:08:49 +0000

Это болезненное ограничение curl --fail. Из man curl :

-f, –fail (HTTP) Ошибки молча (нет вывода вообще) на сервере ошибки

Но нет способа получить оба ненулевой код возврата AND тело ответа в 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[.

11
11
11
2015-07-15 20:08:53 +0000

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

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

curl -I http://example.org 2>/dev/null | head -n 1 | cut -d$' ' -f2
9
9
9
2016-01-07 08:36:07 +0000

По 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]'
6
6
6
2016-11-21 11:28:27 +0000

Используйте следующую команду cURL и пропустите его так:

$ curl -I -s -L _COPY10_list | grep “HTTP/1.1”

Вот что делает каждый флаг:

  • -I: Показывать только заголовки ответов
  • -s: Silent - Не показывать прогресс бар
  • -L: Следуйте за заголовками Location:

: Здесь ссылка на HTTP статус коды .

: Выполняется из командной строки. Этот скруток работает в бесшумном режиме, следует за любыми перенаправлениями, получите HTTP заголовки. grep распечатает код состояния HTTP на стандартный вывод.

5
5
5
2017-03-08 05:12:46 +0000
curl -so -i /dev/null -w "%{http_code}" http://www.any_example.com

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

  1. данные ответа, если какие-либо данные возвращаются API, как ошибка
  2. код состояния
4
4
4
2016-06-23 10:37:18 +0000

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

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

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

curl -I http://www.example.org
4
4
4
2018-04-01 17:21:59 +0000

Пример использования кодов ответов. Я использую его для перезагрузки баз данных 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
```.
3
3
3
2017-10-07 07:32:50 +0000

ОП хочет знать код статуса. Часто при загрузке файла вы также хотите получить ощущение его размера, поэтому я использую 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

Пожалуйста, обратите внимание, что -o в curl должен следовать полный путь к файлу + имя файла. Это позволяет вам сохранять файлы в разумной структуре имен, когда вы d/l их с помощью curl. Также обратите внимание, что -s и -S, используемые вместе, заглушают вывод, но показывают ошибки. Обратите также внимание, что -R пытается установить временную метку файла в соответствие с веб-файлом.

Мой ответ основан на том, что изначально предлагал @pvandenberk, но, кроме того, он фактически где-то сохраняет файл, а не просто направляет его в /dev/null.

1
1
1
2019-06-04 08:08:22 +0000

Разделить содержимое вывода на stdout и код HTTP статус stderr:

curl http://www.example.org -o >(cat >&1) -w "%{http_code}\n" 1>&2

Если только HTTP код статуса желательно stderr, --silent может быть использован:

curl --silent http://www.example.org -o >(cat >&1) -w "%{http_code}\n" 1>&2

Желаемый поток может быть выбран путем перенаправления ненужного на /dev/null:

$ (curl --silent http://www.example.org -o >(cat >&1) -w "%{http_code}" 1>&2) 1>/dev/null
200
$ (curl --silent http://www.example.org -o >(cat >&1) -w "%{http_code}" 1>&2) 2>/dev/null
<!doctype html>
...

Заметка, что для второго перенаправления, чтобы вести себя как хотите, мы должны запустить команду curl в подоболочке.

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

7
19
15
6
6