HTTP ステータス コードを出力するために curl を取得するには?

curl http status

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

  998  kdt  2011-04-18


ベストアンサー

ウェブサーバが HEAD リクエストに応答できる場合には、これは動作するはずです (これは GET を実行しません)

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

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

678  pberlijn  2011-04-18


HTTP ステータスコードだけを出力するより具体的な方法は、次のようなものです

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

構文解析を必要としないので、スクリプトでの作業がとても簡単になりました。)

レスポンスの負荷性能を向上させるために、パラメータ -I を追加することができます。このパラメータは、応答本文をダウンロードすることなく、応答のステータスやヘッダを要求するだけです

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

i.e.:

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

1042  pvandenberk  2012-06-28


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

curl -i http://example.org

-iの良いところは、-X POSTでも使えるところです

282  Cyril David  2012-12-04


結果だけでなくヘッダも見たい場合は、冗長オプションを使用することができます

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

252  Enrico Susatyo  2012-05-03


HTTP ステータスコードを変数に取り込んでも内容を STDOUT にリダイレクトしたい場合は、2つの STDOUT を作成する必要があります。これは プロセス置換 >()コマンド置換 $() で行うことができます

まず、現在のプロセスのSTDOUTのファイルディスクリプタ3exec 3>&1で作成します

その後、curl の -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')

SamK が下のコメントで指摘しているように、SamK が で動作しないことに注意してください

79  Heath Borders  2015-01-08


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

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

どのようなリクエストタイプでも使用できます

37  Grzegorz Luczywo  2014-08-05


ステータスコードのみ

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

すべてのクレジットは、このGISTにあります

25  mahatmanich  2017-02-08


これは痛いcurl --fail制限です。man curlより

-f, –fail (HTTP) サーバエラー時に無言で失敗します(出力は一切ありません)

しかし、標準出力でゼロではないリターンコードとレスポンスボディの両方を取得する方法はありません

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[

18  Lucas Cimon  2016-04-06


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]'

12  zafar142003  2016-01-07


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

レスポンスコードが含まれています

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

11  Filip Spiridonov  2015-07-15


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

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

それぞれの旗が何をしているかというと、こんな感じです

  • -I: レスポンスヘッダのみを表示します
  • -s: サイレント – プログレスバーを表示しない
  • -L:Location:ヘッダに従う

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

コマンドラインから実行します。このcurlはサイレントモードで実行され、リダイレクトを追跡し、HTTPヘッダを取得します

6  Savitoj Singh  2016-11-21


ここでは、GETを使用してHTTPコードを返すいくつかのcurlコマンドがあります

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

以下のアプローチはHEADを使用していますが、これはより高速ですが、ウェブにあまり準拠していないHTTPサーバではうまく動作しない場合があることを覚えておいてください

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

5  sorin  2016-06-23


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

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

  1. レスポンスデータで、APIからエラーのようなデータが返ってきた場合は、そのデータを返します
  2. status code

5  srana  2017-03-08


レスポンスコードの使い方の例。Geoliteデータベースが変更された場合にのみ再ダウンロードするために使っています(-z) & また、リダイレクト(-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

4  Stuart Cardall  2018-04-01


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 はファイルのタイムスタンプをウェブファイルのタイムスタンプに設定しようとすることにも注意してください

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

3  sakumatto  2017-10-07


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

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

HTTPステータスコードのみを標準エラーにしたい場合は、--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 コマンドを実行する必要があることに注意してください

3  Jaakko  2019-06-04


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