HTTP 상태 코드가 200이 아닌 경우 exitCode가 0이 아닌 cURL이 실패하도록 할 수 있습니까? 않습니다 . HTTP

curl이 HTTP 500 응답을 받았을 때 실패 (! = 0)를 의미하는 종료 코드를 반환한다고 가정했지만 항상 그렇지 않습니다 .

HTTP 상태 코드가 200이 아닌 경우 exitCode가 0이 아닌 cURL을 실패하게 만드는 방법이 있습니까? 내가 사용할 수는 -w "%{http_code}"있지만 종료 코드가 아닌 STDOUT에 넣습니다. (출력 외에도 파일로 리디렉션하고 싶지 않지만 화면으로 캡처하는 데 관심이 있습니다).



답변

curl --fail 당신이 원하는 것의 일부를 수행합니다 :

부터 man curl:

-f, --fail

(HTTP) 서버 오류에서 자동으로 실패합니다 (아무 것도 출력되지 않음). 이것은 대부분 실패한 시도를보다 잘 처리하기 위해 스크립트 등을 더 잘 활성화하기 위해 수행됩니다. 일반적으로 HTTP 서버가 문서를 전달하지 못하면 HTML 문서를 리턴합니다 (이유 및 그 밖의 이유도 설명 함). 이 플래그는 curl이이를 출력하지 못하게하고 오류 22를 리턴합니다.

이 방법은 안전하지 않으며 인증이 실패 할 때 (응답 코드 401 및 407) 실패한 응답 코드가 미끄러지는 경우가 있습니다.

그러나 화면으로의 출력을 차단합니다.


답변

말린 페이지의 내용 만 표시하려면 다음을 수행하십시오.

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

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

이는 HTTP 상태 코드를 STDOUT에 쓰는 동안 페이지 컨텐츠를 STDERR에 기록하므로 변수 STATUSCODE에 지정할 수 있습니다 .


답변

플래그 조합을 사용하여 수행 할 수있었습니다.

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

–silent 는 진행률을 숨기고 오류
–show-error 는 요청이 실패하면 --silent
–fail에 의해 숨겨진 오류 메시지를 표시 합니다.


답변

네, 할 수있는 방법이 있지만 3 가지 컬 옵션이 포함되어 있기 때문에 분명하지 않습니다.

curl -s --fail --show-error https://httpbin.org/status/200 > /dev/null
curl -s --fail --show-error https://httpbin.org/status/401 > /dev/null
curl -s --fail --show-error https://httpbin.org/status/404 > /dev/null
curl -s --fail --show-error https://bleah-some-wrong-host > /dev/null

이것은 최종 2xx리턴 코드로 curl end-us를 수행 할 때만 성공 (0)이 발생 stdout하고 본문 을 가져오고 오류가 stderr에 표시되도록합니다.

curl 문서는 –fail이 일부 401 코드에서 성공할 수 있다고 언급하기 때문에 약간 혼동 될 수 있습니다. 적어도 –show-error와 동시에 사용될 때는 사실이 아닌 테스트를 기반으로합니다.

지금까지 curl이 이러한 옵션을 사용하는 http가 아닌 경우 curl이 성공을 반환하는 경우를 찾을 수 없었습니다.