Я использую curl
в командной строке Linux для выполнения HTTP-запросов. Тела ответов печатаются в standard out, что нормально, но я не вижу на справочной странице, как заставить curl печатать код состояния HTTP из ответа (404, 403 и т. д.). Такое возможно?
Получение curl для вывода кода состояния HTTP?
15 ответов
Это должно работать для вас if веб-сервер способен отвечать на запросы головы (это не будет выполнять GET
):
curl -I http://www.example.org
в качестве дополнения, чтобы cURL следовал перенаправлениям (статусы 3xx), добавьте-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/
Если вы хотите увидеть заголовок, а также результат, вы можете использовать опцию 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
вы можете распечатать код состояния, в дополнение ко всем заголовкам, выполнив следующие действия:
curl -i http://example.org
хорошая вещь о -i
он работает с -X POST
Как хорошо.
если вы хотите записать код состояния 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 отмечено в комментариях ниже.
переопределить вывод curl:
curl -sw '%{http_code}' http://example.org
может использоваться с любым типом запроса.
это отправит запрос на url, получит только первую строку ответа, разделит ее на блоки и выберет вторую.
содержит код ответа
curl -I http://example.org 2>/dev/null | head -n 1 | cut -d$' ' -f2
код состояния только
[0]$ curl -LI http://www.example.org -o /dev/null -w '%{http_code}\n' -s
[0]$ 200
все заслуга в этом GIST
для 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[.
curl -so -i /dev/null -w "%{http_code}" http://www.any_example.com
возвращает следующую информацию:
- данные ответа, если какие-либо данные возвращаются API, как ошибка
- код состояния
вот команда curl, использующая GET
и это возвращает код HTTP.
curl -so /dev/null -w '%{response_code}' http://www.example.org
пожалуйста, помните, что подход ниже использует HEAD
, который быстрее, но он не может хорошо работать с некоторыми веб-менее совместимых серверов HTTP.
curl -I http://www.example.org
используйте следующую команду cURL и передайте ее grep следующим образом:
$ завиток -я -с-Л http://example.com/v3/get_list | грэп "протокол HTTP/1.1"
вот что делает каждый флаг:
-I
: показывать только заголовки ответов-s
: Silent-не показывать прогресс бар-L
: заLocation:
заголовки
вот ссылка состояние HTTP коды.
запуск из командной строки. Этот curl работает в автоматическом режиме, следует за любыми перенаправлениями, получает 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
тогда я жду окончания curl
wait ${!}
перед запуском следующей команды. Выше, когда используется в сценарии многих команд, как выше, дает хороший ответ, как:
http: 200 42824
http: 200 34728
http: 200 35452
обратите внимание, что после-o в curl должен следовать полный путь к файлу + имя файла. Это позволяет вам thusly сохранять файлы в разумной структуре имен, когда вы 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
Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]