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

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

27
задан kdt
02.03.2023 19:19 Количество просмотров материала 2910
Распечатать страницу

15 ответов

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

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

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

385
отвечен pberlijn 2023-03-04 03:07

более конкретный способ печати просто код состояния 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/
666
отвечен pvandenberk 2023-03-04 05:24

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

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
178
отвечен Enrico Susatyo 2023-03-04 07:41

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

curl -i http://example.org

хорошая вещь о -i он работает с -X POST Как хорошо.

153
отвечен Cyril David 2023-03-04 09:58

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

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

затем используйте керла -o опция для перенаправления содержимого ответа на временный fifo с помощью подстановки команд, и затем в этой подстановке команд перенаправьте выходные данные обратно в текущий файловый дескриптор процесса STDOUT 3 С -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 as SamK отмечено в комментариях ниже.

49
отвечен Heath Borders 2023-03-04 12:15

переопределить вывод curl:

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

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

27
отвечен Grzegorz Luczywo 2023-03-04 14:32

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

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

curl -I http://example.org 2>/dev/null | head -n 1 | cut -d$' ' -f2
10
отвечен Filip Spiridonov 2023-03-04 16:49

код состояния только

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

все заслуга в этом GIST

10
отвечен mahatmanich 2023-03-04 19:06

для 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]'
8
отвечен zafar142003 2023-03-04 21:23

Это больно 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[.

7
отвечен Lucas Cimon 2023-03-04 23:40
curl -so -i /dev/null -w "%{http_code}"  http://www.any_example.com

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

  1. данные ответа, если какие-либо данные возвращаются API, как ошибка
  2. код состояния
4
отвечен srana 2023-03-05 01:57

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

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

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

 curl -I http://www.example.org
3
отвечен sorin 2023-03-05 04:14

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

$ завиток -я -с-Л http://example.com/v3/get_list | грэп "протокол HTTP/1.1"

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

  • -I: показывать только заголовки ответов
  • -s: Silent-не показывать прогресс бар
  • -L: за Location: заголовки

вот ссылка состояние HTTP коды.

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

2
отвечен Savitoj Singh 2023-03-05 06:31

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

тогда я жду окончания curl

wait ${!}

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

http: 200 42824

http: 200 34728

http: 200 35452

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

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

1
отвечен sakumatto 2023-03-05 08:48

пример использования кодов ответа. Я использую это, чтобы повторно загрузить базы данных 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
1
отвечен Stuart Cardall 2023-03-05 11:05

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх