stdout – HTTP ステータスコードが 200 でない場合、exitCode が 0 以外の場合に cURL を失敗させることはできますか?

curl exit-code http-status-code-500 stdout

私は、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


タイトルとURLをコピーしました