HTTPリクエストを発行するために、Linuxのコマンドラインでcurl
を使用しています。レスポンスボディは標準出力に出力されますが、これは問題ありませんが、レスポンスからHTTPステータスコードを印刷するためのcurlの取得方法をmanページから見ることはできません(404、403など)。これは可能ですか?
ifWebサーバーがHEADリクエストに応答できる場合は、これでうまくいくはずです(これはGET
を実行しません)。
curl -I http://www.example.org
さらに、cURLにリダイレクト(3xxステータス)をフォローさせるには、-Lを追加します。
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/
ヘッダと結果を見たい場合は、冗長オプションを使用できます。
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
以下のようにして、すべてのヘッダーに加えて状況コードを印刷することができます。
curl -i http://example.org
-i
の良いところは、-X POST
でも動作することです。
HTTPステータスコードを変数にキャプチャしたいが、それでもコンテンツをSTDOUTにリダイレクトしたい場合は、2つのSTDOUTを作成する必要があります。 プロセス置換>() および コマンド置換$() .
まず、現在のプロセスのSTDOUT用のファイル記述子3
をexec 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')
これは/bin/sh
では SamKが以下のコメントで述べたように機能しないことに注意してください 。
カール出力を再定義します。
curl -sw '%{http_code}' http://example.org
任意のリクエストタイプで使用できます。
ステータスコードONLY
[0]$ curl -LI http://www.example.org -o /dev/null -w '%{http_code}\n' -s
[0]$ 200
これに対するすべての功績 要旨
これはリクエストをurlに送り、レスポンスの最初の行だけを取得し、それをブロックに分割して2番目のものを選択します。
応答コードが含まれています
curl -I http://example.org 2>/dev/null | head -n 1 | cut -d$' ' -f2
これは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
では使用されない戻りコード)を返します。
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]'
curl -so -i /dev/null -w "%{http_code}" http://www.any_example.com
これにより、以下の情報が返されます。
次のcURLコマンドを使用して、grepにパイプ処理します。
$ curl -I -s -L http://example.com/v3/get_list | grep "HTTP/1.1"
各フラグの機能は次のとおりです。
-I
:レスポンスヘッダのみを表示-s
:Silent - プログレスバーを表示しない-L
:Location:
ヘッダーをフォローするこれは HTTPステータスコード へのリンクです。
コマンドラインから実行します。このcurlはサイレントモードで動作し、あらゆるリダイレクトをたどり、HTTPヘッダを取得します。 grepはHTTPステータスコードを標準出力に表示します。
これはGET
を使っているHTTPコマンドを返すcurlコマンドです。
curl -so /dev/null -w '%{response_code}' http://www.example.org
以下のアプローチではHEAD
を使用していますが、これは高速ですが、Webに準拠していないHTTPサーバーではうまく機能しない場合があります。
curl -I http://www.example.org
応答コードの使用方法の例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
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を指定するのではなく、実際にファイルをどこかに保存します。
コンテンツをstdout
に、HTTPステータスをstderr
に出力します。
curl -I http://www.example.org -o >(cat >&1) -w "%{http_code}" 1>&2