2011-04-18 10:28:57 +0000 2011-04-18 10:28:57 +0000
864
864

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

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

回答 (16)

906
906
906
2012-06-28 00:25:11 +0000

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/
``` で返します。
572
572
572
2011-04-18 10:56:02 +0000

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

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

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

237
237
237
2012-05-03 04:28:44 +0000

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

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
218
218
218
2012-12-04 20:45:49 +0000

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

curl -i http://example.org

&001

&001

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

71
71
71
2015-01-08 20:59:43 +0000

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

まず、現在のプロセスのSTDOUT用のファイルディスクリプター3exec 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では動作しないことに注意してください。

35
35
35
2014-08-05 18:18:29 +0000

カール出力の再定義:

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

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

19
19
19
2017-02-08 10:44:15 +0000

ステータスコード ONLY

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

すべてのクレジットをこの GIST

14
14
14
2016-04-06 13:08:49 +0000

これは痛い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[.

11
11
11
2015-07-15 20:08:53 +0000

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

9
9
9
2016-01-07 08:36:07 +0000

POSTリクエストでは、以下のように動作しました。

6
6
6
2016-11-21 11:28:27 +0000

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

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

ここでは、それぞれのフラグが何をするかを示します:

  • -I. レスポンスヘッダのみを表示する
  • -s. サイレント - プログレスバーを表示しない
  • -L.

ここに HTTP ステータスコード へのリンクがあります。

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

5
5
5
2017-03-08 05:12:46 +0000

エラー

1.レスポンスデータ、もしデータがAPIによって返された場合はエラー 2.ステータスコード

4
4
4
2016-06-23 10:37:18 +0000

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

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

以下のアプローチは HEAD を使用していることを覚えておいてください。

4
4
4
2018-04-01 17:21:59 +0000

レスポンスコードの使い方の例。私は、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
3
3
3
2017-10-07 07:32:50 +0000

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 への指示ではなく、実際にファイルをどこかに保存します。

1
1
1
2019-06-04 08:08:22 +0000

出力内容を 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 コマンドを実行する必要があることに注意してください。

関連する質問

7
19
15
6
10