curlを取得してHTTPステータスコードを出力しますか?


800

curlLinuxのコマンドラインでHTTP要求を発行するために使用しています。応答本文は標準出力に印刷されますが、これは問題ありませんが、応答からHTTPステータスコード(404、403など)を印刷する方法をmanページから見ることはできません。これは可能ですか?


私に関しては、HTTPステータスコードを取得する方法をマニュアルから確認できますが、オプション-wは機能しません。バグをアップルに報告しました。
ニコラスバルブレスコ

19
-iフラグは、のようにcurl -i https://www.example.com/、あたりとして、あなたは何をしたいおそらくsuperuser.com/a/514798/190188
CAW

なぜただのようなものではないのcurl -IL http://www.example.com | grep "^HTTP\/"ですか?
St3an

ない将来、自己に:あなたが望む答えはおそらく、シリルDavidの(現在は4位で)である
WhiteHotLoveTiger

回答:


526

これは、WebサーバーがHEADリクエストに応答できる場合に機能します(これは実行されませんGET)。

curl -I http://www.example.org

さらに、cURLがリダイレクト(3xxステータス)に従うようにするには、-Lを追加します。


155
NB:curl -IHEAD HTTPリクエストを実行します。これは、一部のWebアプリケーションサーバーおよびサービスのHTTPステータスコードのテストに問題が発生する可能性があります
Jay Taylor

16
ステータス番号だけを取得するには、パイプしてくださいhead -n 1|cut -d$' ' -f2
ベヌバード

33
curlのstderr:をリダイレクトすることを忘れないでくださいcurl -I http://www.example.org 2>/dev/null | head -n 1 | cut -d$' ' -f2。リダイレクト後に最終ステータスが必要な場合は、-Lをcurlに追加します。
アーロンブレヌーシュ14

1
HEADリクエストのみを実行した後にリダイレクトを実行すると、アプリのプログラミング方法によっては興味深い動作が発生する場合があります。
スコットマッキンタイア

31
curl -I -X GETGETリクエストを送信しますが、同じ出力を提供します。
ジギー

835

HTTPステータスコードのみを出力するより具体的な方法は、次の行に沿ったものです。

curl -s -o /dev/null -w "%{http_code}" http://www.example.org/

解析を必要としないため、スクリプトでの作業がはるかに簡単です:-)

パラメーター-Iは、応答負荷パフォーマンスを改善するために追加される場合があります。このパラメーターは、応答のステータス/ヘッダーを要求するだけで、ダウンロードの応答本文はありません。

注: %{http_code} HTTPペイロードの最初の行に戻ります

すなわち:

curl -s -o /dev/null -I -w "%{http_code}" http://www.example.org/

54
-w "%{http_code}"は、ステータスコードを出力するビットです。そこに改行を追加して、コードを本文から分離できます(-w "\ n \ n%{http_code} \ n")
ジェフリーマルティネス14年

7
うわー、これ/dev/nullは私が使用しているWindowsバージョンのcurlでも動作します。
ウーヴェ・ケイム

3
すべてが/ dev / nullに移動してもファイル全体がダウンロードされるため、巨大なファイルのステータスコードを確認するには理想的ではないと思います。httping -c 1 -s -G -mGETを発行し、ファイル全体をダウンロードしませんが、この質問は具体的にcurlについてのものであると認識しています。
RomanSt

40
参考:-s=ダウンロードの進行状況を-o /dev/null表示しない、-w "%{http_code}"= 本文を表示しない、=終了後にHTTP応答コードをstdoutに書き込む。
Ajedi32

1
「%{http_code}」を囲む引用符は必要ですか?
ハカン馬場

217

結果だけでなくヘッダーも表示する場合は、verboseオプションを使用できます。

curl -v http://www.example.org
curl --verbose http://www.example.org

ステータスがヘッダーに表示されます。例えば

< Date: Tue, 04 Nov 2014 19:12:59 GMT
< Content-Type: application/json; charset=utf-8
< Status: 422 Unprocessable Entity

26
詳細フラグを示すための+1は、追加の詳細を提供します。RESTアプリのテストに最適です。
MrOodles

8
POST要求を行うときに非常に使いやすい+1(curl -v --data "...")
MegaTux 14年

1
それも(stdoutに標準エラー出力とレスポンスボディへのHTTPステータスの詳細)は、2つの異なるファイル出力でそれらを分割
phil294

201

以下を実行することにより、すべてのヘッダーに加えてステータスコードを印刷できます。

curl -i http://example.org

良い点-iは、-X POST同様に機能することです。


36
受け入れられた回答(HEADリクエストを行う)よりもはるかに優れています。
neu242 14年

10
明らかかもしれません-i HTTPメソッドだけでなくGETPOST... でも機能します:)
mac 14年

3
それはスクリプトで使用する場合の作業のほとんどに適して、カール出力ヘッダとボディの両方を作るよう最善の答え
Sargeのボルシチ

6
これが最良の回答であり、-s(進行状況メーターやエラーメッセージを表示しない)および-S(結局エラーメッセージを表示する)と一緒に使用できます
ジョナサンハートリー

69

HTTPステータスコードを変数にキャプチャしつつ、コンテンツをSTDOUTにリダイレクトする場合は、2つのSTDOUTを作成する必要があります。そのためには、プロセス置換>()およびコマンド置換$()を使用します。

まず、を使用し3て、現在のプロセスのSTDOUTのファイル記述子を作成しますexec 3>&1

その後、カールの使用-oコマンド置換を使用して、一時FIFOに応答内容をリダイレクトして、そのコマンド置換中に、戻ってあなたの現在のプロセスのSTDOUTのファイル記述子への出力をリダイレクトするためのオプション3では-o >(cat >&3)

すべてをまとめてbash 3.2.57(1)-release(標準macOS):

# creates a new file descriptor 3 that redirects to 1 (STDOUT)
exec 3>&1 
# Run curl in a separate command, capturing output of -w "%{http_code}" into HTTP_STATUS
# and sending the content to this command's STDOUT with -o >(cat >&3)
HTTP_STATUS=$(curl -w "%{http_code}" -o >(cat >&3) 'http://example.com')

これはで動作しないことに注意してください/bin/shとしてSamKは以下のコメントで述べました


5
それは深刻なスリッカーです...そして私はそれが好きです!
spyle

3
次に、出力を別の変数にリダイレクトするにはどうすればよいですか?
ロジャーフィルマー

1
出力はにSTDOUTあるため、コマンドからの出力を通常のコマンドと同じように好きな場所にリダイレクトできるはずです。ただし、これはテストしていません。
ヒース国境

1
/ bin / shでは機能しません。
-SamK

あなたはシェルの移植をしたい場合の答えは良い、あなたはまた、実際のファイルと後で猫、それをにリダイレクトすることができます
akostadinov



11

これは苦痛なcurl --fail制限です。からman curl

-f、-fail(HTTP)サーバーエラーでサイレントに失敗します(まったく出力されません)

ただし、ゼロ以外の戻りコード stdoutの応答本体の両方を取得する方法はありません。

pvandenberkの答えとSO学んだこの他の非常に有用なトリックに基づいて、ここに回避策があります:

curl_with_error_code () {
    _curl_with_error_code "$@" | sed '$d'
}
_curl_with_error_code () {
    local curl_error_code http_code
    exec 17>&1
    http_code=$(curl --write-out '\n%{http_code}\n' "$@" | tee /dev/fd/17 | tail -n 1)
    curl_error_code=$?
    exec 17>&-
    if [ $curl_error_code -ne 0 ]; then
        return $curl_error_code
    fi
    if [ $http_code -ge 400 ] && [ $http_code -lt 600 ]; then
        echo "HTTP $http_code" >&2
        return 127
    fi
}

この関数はとおりに振る舞うcurlが、127(リターンコードで未使用戻りますcurl範囲[400、600のHTTPコードの場合)。


エラー出力を確認できないことは、そうでなければ非常に便利な--failの痛ましい制限です。エラー出力を表示せずにREST APIの障害を診断するにはどうすればよいですか?残念ながら、カールメンテナーバグ担当者は、--fail-but-show-errorを提供しないことを固く主張しています。github.com/curl/curl/issues/1978
ジャムシッド

ドキュメントに記載されているように、401および407 HTTPコードでは機能しません:(
Logan Mzz

11

これにより、リクエストがurlに送信され、レスポンスの最初の行のみが取得され、ブロックで分割され、2番目の行が選択されます。

応答コードが含まれています

curl -I http://example.org 2>/dev/null | head -n 1 | cut -d$' ' -f2

1
このコードが何をするのか、OPによって与えられた問題にどのように対処するのかを説明できますか?説明のつかないコードは、ユーザーにとって信頼できず、危険なように見える場合があります。
bwDraco

1
もちろん、リクエストをurlに送信し、レスポンスの最初の行のみを取得し、ブロックで分割して、2番目の行を選択します。OPが探している応答コードが含まれています。
フィリップスピリドノフ

9

POSTリクエストの場合、以下が機能しました。

curl -w 'RESP_CODE:%{response_code}' -s -X POST --data '{"asda":"asd"}' http://example.com --header "Content-Type:application/json"|grep -o  'RESP_CODE:[1-4][0-9][0-9]'

6

次のcURLコマンドを使用し、次のようにgrepにパイプします。

$ curl -I -s -L http://example.com/v3/get_list | grep "HTTP / 1.1"

各フラグの機能は次のとおりです。

  • -I:応答ヘッダーのみを表示
  • -s:サイレント-進行状況バーを表示しない
  • -LLocation:ヘッダーに従う

HTTPステータスコードへのリンクを次に示します

コマンドラインから実行します。このcurlはサイレントモードで実行され、リダイレクトに従ってHTTPヘッダーを取得します。grepは、HTTPステータスコードを標準出力に出力します。


5
curl -so -i /dev/null -w "%{http_code}"  http://www.any_example.com

これにより、次の情報が返されます。

  1. エラーなどのAPIによってデータが返された場合の応答データ
  2. 状態コード

これはリダイレクトに従いません。この既存の答えは良いですsuperuser.com/a/442395/475508
cricket_007

もちろん、あなたもそれを参照することができます!!
srana

4

以下は、使用GETしていてHTTPコードを返すcurlコマンドです。

curl -so /dev/null -w '%{response_code}' http://www.example.org

以下のアプローチではを使用していることを覚えておいてくださいHEAD。これは高速ですが、一部のWeb非準拠のHTTPサーバーではうまく機能しない場合があります。

 curl -I http://www.example.org

少なくともOS Xでは動作しません。
アイン

OS X High Sierra 10.13.6で正常に動作しています。
ベン・バロン

4

応答コードの使用方法の例。Geoliteデータベースが変更された場合(-z)およびリダイレクトに従う場合()にのみ、これを使用してGeoliteデータベースを再ダウンロードします-L

url=http://example.com/file.gz
file=$(basename $url)

response=$(curl -L -s -o $file -z $file $url -w "%{http_code}")

case "$response" in
        200) do_something ;;
        301) do_something ;;
        304) printf "Received: HTTP $response (file unchanged) ==> $url\n" ;;
        404) printf "Received: HTTP $response (file not found) ==> $url\n" ;;
          *) printf "Received: HTTP $response ==> $url\n" ;;
esac

3

OPはステータスコードを知りたい。多くの場合、ファイルをダウンロードするときにサイズの感覚も取得したいので、最初にcurlを使用してファイルのステータスコードとサイズを表示し、次に詳細なファイルを閉じて、目的の場所と名前にファイルを転送します:

curl -R -s -S -w  "\nhttp: %{http_code} %{size_download}\n" -o /Users/myfiles/the_local_name.html http://archive.onweb.com/the_online_name.html

それからカールの仕上げを待つ

wait ${!}

次のコマンドを実行する前に。上記のような多くのコマンドのスクリプトで上記を使用すると、次のような素晴らしい応答が得られます。

http:200 42824

http:200 34728

http:200 35452

curlの-oの後には、ファイルのフルパス+ファイル名を続ける必要があることに注意してください。これにより、curlを使用してファイルをd / lしたときに、ファイルを適切な名前の構造で保存できます。また、-sと-Sを一緒に使用すると、出力は無音になりますが、エラーは表示されます。-Rは、ファイルのタイムスタンプをWebファイルのタイムスタンプに設定しようとすることにも注意してください。

私の答えは、元々@pvandenberkが提案したものに基づいていますが、それに加えて、単に/ dev / nullにリダイレクトするのではなく、実際にファイルをどこかに保存します。


1

出力コンテンツをにstdout、HTTPステータスコードをに分割しますstderr

curl http://www.example.org -o >(cat >&1) -w "%{http_code}\n" 1>&2

HTTPステータスコードのみがstderrに必要な場合は、--silent使用できます。

curl --silent http://www.example.org -o >(cat >&1) -w "%{http_code}\n" 1>&2

不要なストリームを次の場所にリダイレクトすることで、目的のストリームを選択できます/dev/null

$ (curl --silent http://www.example.org -o >(cat >&1) -w "%{http_code}" 1>&2) 1>/dev/null
200
$ (curl --silent http://www.example.org -o >(cat >&1) -w "%{http_code}" 1>&2) 2>/dev/null
<!doctype html>
...

2番目のリダイレクトが希望どおりに動作するには、サブシェルでcurlコマンドを実行する必要があることに注意してください


1
bashプロセス置換が必要です。
ジャッコ

@Bruno、私からの例を変更しsuperuser.com/revisions/1444693/2私が考えるほど、/tmp/out /tmp/err並列に実行する場合、ファイルが予期しない結果を引き起こす可能性があります。
Jaakko
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.