Вопрос Могу ли я сделать сбой cURL с кодом exitCode, отличным от 0, если код статуса HTTP не равен 200?


Я всегда предполагал, что когда curl получил ответ HTTP 500, он возвращал код выхода, который означал отказ (! = 0), но это похоже не случай.

Есть ли способ, с помощью которого я могу сделать cURL fail с кодом exitCode, отличным от 0, если код статуса HTTP не равен 200? Я знаю, что могу использовать -w "%{http_code}" но это ставит его в STDOUT, а не как код выхода (кроме того, я также заинтересован в захвате вывода, который я не хочу перенаправлять на файл, а на экран).


160
2018-05-01 12:37


происхождения




ответы:


curl --fail делает часть того, что вы хотите:

из man curl:

-f, --fail

(HTTP) Неудача (без вывода на выходе) сбой на сервере. В основном это делается для лучшего включения сценариев и т. Д., Чтобы лучше справляться с неудачными попытками. В обычных случаях, когда HTTP-сервер не может предоставить документ, он возвращает HTML-документ, указывающий на это (что часто также описывает причины и многое другое). Этот флаг предотвратит вывод curl из этой ошибки и возврата 22.

Этот метод не является отказоустойчивым, и есть случаи, когда неудачные коды ответов проскальзывают, особенно когда речь идет об аутентификации (коды ответов 401 и 407).

Но он блокирует вывод на экран.


178
2017-10-10 18:36



Итак, какие части его делают и не делают? - rogerdpack
@rogerdpack tl; dr он возвращает ненулевое значение, когда обнаруживает плохую реакцию, но это не позволит OP захватить ответ - rampion
Это не означает, что HTTP 301 перемещается постоянно. curl все еще выдал код выхода 0. - wisbucky
@wisbucky 301 не является ошибкой, это код статуса перенаправления. Ошибки - коды состояния 4xx и 5xx. - M. Justin


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

STATUSCODE=$(curl --silent --output /dev/stderr --write-out "%{http_code}" URL)

if test $STATUSCODE -ne 200; then
    # error handling
fi

Это записывает содержимое страницы в STDERR при записи кода состояния HTTP в STDOUT, поэтому его можно назначить переменной StatusCode,


61
2018-05-01 15:31



Как насчет того, если я хочу вывести ответ при ошибке (не 200), но 0 код статуса из сценария? - Justin
@Justin: Как насчет if [ "$statuscode" -ne 200 ]; then exit "$statuscode"; fi ? - ghoti
@ghoti: Поддерживаются только неподписанные 8-битные коды выхода, поэтому это может немного запутать. - Dennis
Ах, правый - и коды будут обертываться на 8 бит, поэтому ошибка 404 становится значением 148, 500 становится 244. Сбивает с толку! :-) - ghoti
Как небольшое изменение, это фиксирует код в переменной, перенаправляя ответ на stdout, а не stderr: { code=$(curl ... as above ...); } 2>&1 Уловка { ... } 2>&1 который позволяет перенаправлять, не создавая другую оболочку как ( ... ) бы. - Tobia


Я смог сделать это, используя комбинацию флагов:

curl --silent --show-error --fail URL

--silent скрывает прогресс и ошибку
--show ошибок показывает сообщение об ошибке, скрытое --silent
--потерпеть неудачу возвращает код выхода> 0, когда запрос не выполняется


11
2017-09-12 14:48



Это не показывает ответ сервера. Я не OP, но я подозреваю, что он хотел увидеть сообщение об ошибке с сервера, который возвращается в теле. Помимо --silent --show-error --fail работает так же, как просто -f/--fail, - waste
На самом деле, --fail возвращает код выхода 22, как задокументировано, - Quolonel Questions
Это не означает, что HTTP 301 перемещается постоянно. curl все еще выдал код выхода 0. - wisbucky
@wisbucky 301 не является ошибкой, это код статуса перенаправления. Ошибки - коды состояния 4xx и 5xx. - M. Justin