web-dev-qa-db-ja.com

HTTPステータスコードを出力するようにcurlを取得する

HTTPリクエストを発行するために、Linuxのコマンドラインでcurlを使用しています。レスポンスボディは標準出力に出力されますが、これは問題ありませんが、レスポンスからHTTPステータスコードを印刷するためのcurlの取得方法をmanページから見ることはできません(404、403など)。これは可能ですか?

730
kdt

ifWebサーバーがHEADリクエストに応答できる場合は、これでうまくいくはずです(これはGETを実行しません)。

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

さらに、cURLにリダイレクト(3xxステータス)をフォローさせるには、-Lを追加します。

471
pberlijn

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/
769
pvandenberk

ヘッダと結果を見たい場合は、冗長オプションを使用できます。

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
207
Enrico Susatyo

以下のようにして、すべてのヘッダーに加えて状況コードを印刷することができます。

curl -i http://example.org

-iの良いところは、-X POSTでも動作することです。

178
Cyril David

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

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

次に、curlの-oオプションを使用して、コマンド置換を使用して応答の内容を一時的なfifoにリダイレクトし、そのコマンド置換内で、出力を現在のプロセスのSTDOUTファイル記述子3-o >(cat >&3)でリダイレクトします。

bash3.2.57(1)-releasemacOSの標準)にまとめると、

# 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が以下のコメントで述べたように機能しないことに注意してください

63
Heath Borders

カール出力を再定義します。

curl -sw '%{http_code}' http://example.org

任意のリクエストタイプで使用できます。

31

ステータスコードONLY

[0]$ curl -LI http://www.example.org -o /dev/null -w '%{http_code}\n' -s
[0]$ 200

これに対するすべての功績 要旨

15
mahatmanich

これはリクエストをurlに送り、レスポンスの最初の行だけを取得し、それをブロックに分割して2番目のものを選択します。

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

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

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

-f、--fail(HTTP)サーバエラー時に黙って失敗します(全く出力されません)。

しかし、0以外の戻りコードの両方を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とまったく同じように動作しますが、HTTPコードが[400、600 [の場合]の場合は127(curlでは使用されない戻りコード)を返します。

10
Lucas Cimon

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]'
9
zafar142003
curl -so -i /dev/null -w "%{http_code}"  http://www.any_example.com

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

  1. レスポンスデータ、エラーのように何らかのデータがAPIによって返された場合
  2. ステータスコード
5
srana

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

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

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

  • -I:レスポンスヘッダのみを表示
  • -s:Silent - プログレスバーを表示しない
  • -LLocation:ヘッダーをフォローする

これは HTTPステータスコード へのリンクです。

コマンドラインから実行します。このcurlはサイレントモードで動作し、あらゆるリダイレクトをたどり、HTTPヘッダを取得します。 grepはHTTPステータスコードを標準出力に表示します。

5
Savitoj Singh

これはGETを使っているHTTPコマンドを返すcurlコマンドです。

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

以下のアプローチではHEADを使用していますが、これは高速ですが、Webに準拠していないHTTPサーバーではうまく機能しない場合があります。

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

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

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
4
Stuart Cardall

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 ${!}

次のコマンドを実行する前に。上記のような多くのコマンドのスクリプトで使用された場合、上記のようにNice応答が得られます。

http:200 42824

http:200 34728

http:200 35452

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

私の答えは、@ pvandenberkが最初に提案したことに基づいていますが、それに加えて、単に/ dev/nullを指定するのではなく、実際にファイルをどこかに保存します。

3
sakumatto

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

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