私は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のファイルディスクリプタ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')
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
これにより、以下の情報が返されます
- レスポンスデータで、APIからエラーのようなデータが返ってきた場合は、そのデータを返します
- 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