パラメータなしでcurlを呼び出すと、httpステータスコード= 404であってもページ出力が得られます。
$ curl http://www.google.com/linux;
<!DOCTYPE html>
<html lang=en>
<meta charset=utf-8>
<meta name=viewport content="initial-scale=1, minimum-scale=1, width=device-width">
<title>Error 404 (Not Found)!!1</title>
<style>
*{margin:0;padding:0}html,code{font:15px/22px arial,sans-serif}html{background:#fff;color:#222;padding:15px}body{margin:7% auto 0;max-width:390px;min-height:180px;padding:30px 0 15px}* > body{background:url(//www.google.com/images/errors/robot.png) 100% 5px no-repeat;padding-right:205px}p{margin:11px 0 22px;overflow:hidden}ins{color:#777;text-decoration:none}a img{border:0}@media screen and (max-width:772px){body{background:none;margin-top:0;max-width:none;padding-right:0}}#logo{background:url(//www.google.com/images/errors/logo_sm_2.png) no-repeat}@media only screen and (min-resolution:192dpi){#logo{background:url(//www.google.com/images/errors/logo_sm_2_hr.png) no-repeat 0% 0%/100% 100%;-moz-border-image:url(//www.google.com/images/errors/logo_sm_2_hr.png) 0}}@media only screen and (-webkit-min-device-pixel-ratio:2){#logo{background:url(//www.google.com/images/errors/logo_sm_2_hr.png) no-repeat;-webkit-background-size:100% 100%}}#logo{display:inline-block;height:55px;width:150px}
</style>
<a href=//www.google.com/><span id=logo aria-label=Google></span></a>
<p><b>404.</b> <ins>That’s an error.</ins>
<p>The requested URL <code>/linux</code> was not found on this server. <ins>That’s all we know.</ins>
$ echo $?;
0
ステータスコードは0です。
--failを指定して呼び出しても、出力は表示されません。
$ curl --fail http://www.google.com/linux;
curl: (22) The requested URL returned error: 404 Not Found
$ echo $?;
22
ステータスコードは22になりました...
Id 'は、http status = 404、500(最初のcurl実行のように)でも出力を取得し、同時に別のシステムエラー(2番目のcurl実行のように、$?= 22)を取得します。 curlで可能ですか?そうでない場合、どうすれば別のツールでこれを達成できますか(このツールはファイルのアップロードと投稿データを受け入れる必要があります!wgetは代替手段ではないようです...)
ありがとう。
まず、エラーコード(または終了コード)の最大値は255
です。 参照 です。
また、--fail
では、探していることを実行できません。ただし、別の方法(シェルスクリプトの記述)を使用してシナリオを処理できますが、それが効果的かどうかはわかりません!
http_code=$(curl -s -o out.html -w '%{http_code}' http://www.google.com/linux;)
if [[ $http_code -eq 200 ]]; then
exit 0
fi
## decide which status you want to return for 404 or 500
exit 204
$?
を実行すると、そこから終了コードを取得できます。
応答HTMLはout.html
ファイル内にあります。
URLをコマンドライン引数としてスクリプトに渡すこともできます。 ここをチェック 。
残念ながらcurlでは不可能です。しかし、wgetでこれを行うことができます。
$ wget --content-on-error -qO- http://httpbin.org/status/418
-=[ teapot ]=-
_...._
.' _ _ `.
| ."` ^ `". _,
\_;`"---"`|//
| ;/
\_ _/
`"""`
$ echo $?
8
Wgetはmultipart/form-dataの送信に適していないため、解決策を見つけました。
_curl -o - -w "\n%{http_code}\n" http://httpbin.org/status/418 | tee >(tail -n 1 | cmp <(echo 2xx) - ) | tee >(grep "char 2"; echo $? > status-code) && grep 0 status-code
_
_-o - -w "\n%{http_code}\n"
_-stdout(実際には次のコマンドにパイプされます)に出力し、最後にステータスコードを出力しますtee
-出力は次のコマンドにパイプされ、さらに標準出力に出力されます
_tail -n 1
_-最後の行からステータスコードを抽出しますcmp <(echo 2xx) -
ステータスコードの比較、最初の文字のみ
_grep "char 2"
_-最初の文字を2にする必要がある場合、そうでなければ失敗する
シェルスクリプトでは、より良い比較を行うこともできます(現在は2xxのみが許可されているため、300のようなリダイレクトはcmp
でエラーとして処理されます)