HTTPステータスコードを出力するためにcurlを取得するには?
Linux上のコマンドラインでHTTPリクエストを発行するためにcurl
を使用しています。レスポンスボディは標準出力に出力されるので問題ないのですが、レスポンスからHTTPステータスコード(404、403など)を出力するためにcurlを取得する方法がマニュアルページからわかりません。これは可能ですか?
HTTP ステータスコードをjustだけ出力するより具体的な方法は、以下の行に沿って何かです:
curl -s -o /dev/null -w "%{http_code}" http://www.example.org/
スクリプトを使用して作業するのがより簡単になります。このパラメータはレスポンスのステータス/ヘッダを要求するだけで、レスポンスボディをダウンロードすることはありません。
注意: -I
は 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
&001
&001
-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
の標準)でまとめてみる:
# 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さんが下のコメントで指摘しているのように、macOS
では動作しないことに注意してください。
カール出力の再定義:
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
すべてのクレジットをこの GIST へ
これは痛いcurl --fail
の制限です。From 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
と全く同じように動作しますが、HTTPコードが[400, 600[.
これはURLにリクエストを送信し、応答の最初の行だけを取得し、ブロックで分割し、2番目のものを選択します。
POSTリクエストでは、以下のように動作しました。
以下の cURL コマンドを使用して、grep にパイプして以下のようにします:
$ curl -I -s -L http://example.com/v3/get__list | grep “HTTP/1.1”
ここでは、それぞれのフラグが何をするかを示します:
-I
. レスポンスヘッダのみを表示する -s
. サイレント - プログレスバーを表示しない -L
. ここに HTTP ステータスコード へのリンクがあります。
コマンドラインから実行します。このcurlはサイレントモードで実行され、任意のリダイレクトを追跡し、HTTPヘッダを取得します。
レスポンスコードの使い方の例。私は、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
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
その後、私は次のコマンドを実行する前に、私はcurl
wait ${!}
の仕上げを待っています。上記のような多くのコマンドのスクリプトで使用された場合、上記のような素敵な応答を与えます:
http:200 42824
http:200 34728
http:200 35452
curlの-oは、ファイルのフルパス+ファイル名が続く必要があることに注意してください。これにより、curl でファイルを d/l したときに、ファイルを適切な名前構造で保存することができます。また、-s と -S を一緒に使用した場合、出力は消音されますが、エラーが表示されることにも注意してください。R はファイルのタイムスタンプをウェブ ファイルのタイムスタンプに設定しようとすることにも注意してください。
私の答えは @pvandenberk が最初に提案したものに基づいていますが、それに加えて、単に /dev/null への指示ではなく、実際にファイルをどこかに保存します。
出力内容を 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 コマンドを実行する必要があることに注意してください。