私は、curl が HTTP 500 レスポンスを取得したときに失敗 (!= 0) を意味する終了コードを返していると常に想定していましたが、そうではないようです
HTTPステータスコードが200でない場合、exitCodeが0と異なる場合にcURLを失敗させる方法はありますか?私は-w "%{http_code}"
を使用することができることを知っていますが、それは終了コードとしてではなく、STDOUTにそれを置きます(その上、私はまた、私はファイルにリダイレクトするのではなく、画面にしたくない出力をキャプチャすることに興味があります)
328 None 2013-05-01
curl --fail
は欲しいものの一部をやってくれる
man curl
から
-f, --fail
(HTTP) サーバエラー時に無言で失敗します(出力は一切ありません)。これは主に、スクリプトなどが失敗した試行をより良く処理できるようにするために行われます。通常、HTTP サーバーがドキュメントの配信に失敗した場合、その旨を示す HTML ドキュメントを返します (これには多くの場合、理由などが記載されています)。このフラグは、curl がそれを出力してエラー 22 を返すことを防ぎます
この方法はフェイルセーフではなく、特に認証が関与している場合には、成功しない応答コードがすり抜けてしまうことがあります(応答コード401および407)
しかし、画面への出力はブロックされます
337 rampion 2013-10-10
カールしたページの内容を表示させたいだけなら、このようにします
STATUSCODE=$(curl --silent --output /dev/stderr --write-out "%{http_code}" URL)
if test $STATUSCODE -ne 200; then
# error handling
fi
これにより、HTTPステータスコードをSTDOUTに書き込むと同時に、ページの内容をSTDERRに書き込み、変数STATUSCODEに代入することができます
105 Dennis 2013-05-01
フラグの組み合わせでできました
curl --silent --show-error --fail URL
-silent は進行状況とエラーを隠します –show-error は --silent
で隠されたエラーメッセージを表示します –fail はリクエストが失敗した場合に終了コード > 0 を返します
59 Ricardo Souza 2017-09-12
はい、それを行う方法がありますが、それは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
これは、成功 (0) が起こるのは、最終的な 2xx
のリターンコードを持つ curl の end-us が stdout
のボディを取得したときだけであり、エラーは標準エラーに表示されることを保証します
curl のドキュメントでは、–fail はいくつかの 401 コードで成功する可能性があると記載されているため、少し混乱しているかもしれないことに注意してください。テストに基づくと、–show-error と同時に使用した場合は、少なくとも真ではありません
今のところ、これらのオプションでhttp-succedsではない場合にcurlが成功を返すケースを見つけることができませんでした
4 sorin 2019-09-04
私も最近こんな感じのものが必要になりましたが、常時出力したいというのもありました。そのためにhttp_codeの抽出とgrepを使ってみました
out=$(curl -H"Content-Type: application/json" -w '\nstatus_code=%{http_code}\n' -s http://localhost:4040${uri} -d "${body}")
code=$(echo ${out}|grep status_code|awk -F"=" '{print $2}')
echo ${out}
if [[ ${code} -ge 400 ]];
then
exit 2;
fi;
3 skipy 2020-02-22
結局、Dennisの回答、出力を保持しながら200以外のステータスコードで失敗する(stderr
まで)クイックワンライナーを参考にして、これに辿り着きました
[ $(curl ... -o /dev/stderr -w "%{http_code}") -eq 200 ]
2 shesek 2020-09-23
これは@Dennisさんの解答を元にしていますが、エラー時のみ出力を表示しています(リターンコードは200
ではありません)
#!/bin/bash
# Create temp file
SCRATCH=$( mktemp -t tmp.XXXXXXXXXX )
# Cleanup temp file on script exit
function cleanup_on_exit {
rm -f "$SCRATCH"
}
trap cleanup_on_exit EXIT
# Perform curl call
HTTP_CODE=$( curl -s -o "$SCRATCH" -w '%{http_code}' your..stuff..here )
# Analyze HTTP return code
if [[ ${HTTP_CODE} -ne 200 ]] ; then
cat "${SCRATCH}"
exit 1
fi
2XX
がOKなHTTPリターンコードの代替処理
# Analyze HTTP return code
if [[ ${HTTP_CODE} -lt 200 || ${HTTP_CODE} -gt 299 ]] ; then
cat "${SCRATCH}"
exit 1
fi
0 t0r0X 2020-07-03