応答とともにhttpステータスコードを返すCurl


110

curlを使用してhttpヘッダーを取得し、httpステータスコードを検索して、応答も返します。コマンドでhttpヘッダーを取得します

curl -I http://localhost

応答を取得するには、次のコマンドを使用します

curl http://localhost

-Iフラグを使用するとすぐに、ヘッダーのみが取得され、応答はありません。1つのコマンドでhttp応答とheaders / httpステータスコードの両方を取得する方法はありますか?


1
これは非常に便利なスニペットですgist.github.com/maxcnunes/9f77afdc32df354883df
rocketspacer

回答:


111

-stdoutへの出力を取得するために出力に使用するように指定しているcurl docを見て解決策を得ることができました。

curl -o - http://localhost

httpリターンコードだけで応答を取得するには、次のようにします

curl -o /dev/null -s -w "%{http_code}\n" http://localhost

12
またはあなたが使うでしょう-i。または、-vいくつかの追加情報が必要な場合もあります。
Daniel Stenberg 2016

2
@DanielStenbergに感謝します。受け入れられた答えは私にとってはうまくいきませんでした--iを使うだけでうまくいきました。
Alejandro Cotilla 2017

2番目のコマンドが欠落している-I @randominstanceOfLivingThing(意図的に空白のオプションでない限り)?それがなければ私にはうまく
いき

2
-o -I-ICWDに文字通り ' ' という名前のファイルを作成することになります。他の誰かがこれを見ていますか?そのためのソリューションは、-o/dev/null -I
JDSの

-Iを削除しました。今気付いて修正しました。-Iは必要ありません。
randominstanceOfLivingThing


36

このコマンドを使用して、他の出力なしでステータスコードを出力します。さらに、HEADリクエストのみを実行し、リダイレクトに従います(-Iおよび-L)。

curl -o -I -L -s -w "%{http_code}" http://localhost

これにより、ヘルススクリプトのステータスコードを非常に簡単に確認できます。

sh -c '[ $(curl -o -I -L -s -w "%{http_code}" http://localhost) -eq 200 ]'

5
これは1年前にすでに回答されています。あなたの答えはどのような新しい価値をもたらしますか?また、回答に説明を記入してください。
Maciej Jureczko

11
@MaciejJureczko-値は単純です。スクリプティングの目的では、この回答は他のすべての回答の中で最も優れています。なぜなら、この回答は、上記のステータスコードと一緒に何行ものゴミの代わりに単一のステータスコードを与えるからです。
aggregate116​​6877

2
しかしOP 、ステータスコードと応答本文の両方が必要であると明確に述べています。彼らは応答コード(質問に記載されている)を取得する方法を知っています
wottle 2018年

2
私はこれを使用するたびにcurl -o -I -L -s -w "%{http_code}" http://localhostファイルが呼び出さ作成され-I、この私がで暗示ファイル出力のための場所を追加周りを取得するために、-oすなわち、行くために/dev/nullcurl -o /dev/null -I -L -s -w "%{http_code}" http://localhost
Thismatters

ただし、HEADがリクエストと同じ出力になるとは限りませんが、サーバーが応答する方法は異なります。したがって、これは実際の答えではありません。
エディ

28

ユーザーにエラー処理を追加するために、応答とコンテンツの両方が必要だったため、この質問を見つけました。

HTTPステータスコードを出力して標準出力に出力し、その内容を別のファイルに書き込むことができます。

curl -s -o response.txt -w "%{http_code}" http://example.com

これにより、ロジックを使用して、応答が処理に値するかどうかを判断できます。

http_response=$(curl -s -o response.txt -w "%{http_code}" http://example.com)
if [ $http_response != "200" ]; then
    # handle error
else
    echo "Server returned:"
    cat response.txt    
fi

http_codeとは何ですか?私はこれを理解していません、もっと説明が必要です
Alexander Mills

-上記で明らかに、それは、HTTPステータスコードを指すdeveloper.mozilla.org/en-US/docs/Web/HTTP/Status
エディ

22

-iオプションでは、あなたがしたいということです。

curl -i http://localhost

-i、--include出力にプロトコルヘッダーを含めます(H / F)

または、冗長オプションを使用できます。

curl -v http://localhost

-v、--verbose操作をよりおしゃべりにする


16

私はこれを使用しました:

    request_cmd="$(curl -i -o - --silent -X GET --header 'Accept: application/json' --header 'Authorization: _your_auth_code==' 'https://example.com')"

HTTPステータスを取得するには

    http_status=$(echo "$request_cmd" | grep HTTP |  awk '{print $2}')
    echo $http_status

応答本文を取得するには、これを使用しました

    output_response=$(echo "$request_cmd" | grep body)
    echo $output_response

8

このコマンド

 curl http://localhost -w ", %{http_code}"

カンマ区切りの本文とステータスを取得します。それらを分割して取り出すことができます。

区切り文字は自由に変更できます。


2
良いヒント!出力の前にステータスコードを追加することは可能ですか?
精神分裂病

6

プログラムで使用する場合は、次のように使用します。

curlwithcode() {
    code=0
    # Run curl in a separate command, capturing output of -w "%{http_code}" into statuscode
    # and sending the content to a file with -o >(cat >/tmp/curl_body)
    statuscode=$(curl -w "%{http_code}" \
        -o >(cat >/tmp/curl_body) \
        "$@"
    ) || code="$?"

    body="$(cat /tmp/curl_body)"
    echo "statuscode : $statuscode"
    echo "exitcode : $code"
    echo "body : $body"
}

curlwithcode https://api.github.com/users/tj

次の出力が表示されます。

statuscode : 200
exitcode : 0
body : {
  "login": "tj",
  "id": 25254,
  ...
}

5

これは、ステータスコード「および」を取得し、適切なjsonまたは適切なフォーマットにフォーマットする方法です。書き込み形式オプションの誤った使用だと主張する人もいますが、スクリプトで本文とステータスコードの両方を使用してステータスコードをチェックし、サーバーからの応答を中継する必要がある場合に役立ちます。

curl -X GET -w "%{stderr}{\"status\": \"%{http_code}\", \"body\":\"%{stdout}\"}"  -s -o - https://github.com 2>&1

上記のコードを実行すると、次の形式でjsonが返されます。

{
"status" : <status code>,
"body" : <body of response>
}

-w write formatオプションを使用すると、stderrが最初に出力されるため、出力をvar http_codeでフォーマットし、応答の本文を値(body)に配置して、var stdoutを使用して囲みを追跡できます。次に、stderr出力をstdoutにリダイレクトすると、http_codeと応答本文の両方をきちんとした出力に組み合わせることができます


1
次のエラーが発生しました- curl: unknown --write-out variable: 'stderr'およびcurl: unknown --write-out variable: 'stdout'
ALex_hha

curl.haxx.se/docs/manpage.html manページに、使用可能な変数が示されています。stderrがカールによって認識されない理由がわからない、Macbookのカールim。このLinux curl doc、computerhope.com / unix / curl.htmから、stderrを変数としても見ていません。おそらくこれはOSのバリエーションです。
Huy Tran

私がこれで私が持っている唯一の問題は、あなたのボディにそのjsonのような引用符がある場合、ボディは無効なjsonより上のjson応答をします
アナウンサー

@theannouncerは十分に公平です。すべての応答が標準のjsonになるわけではないため、開発者はそれに応じて調整することを期待します。回答の性質上、調整が必要な場合がありました。
Huy Tran

1

これを達成するための私の方法

両方(ヘッダーと本文)を取得するには、通常、次のようにa curl -D- <url>を実行します。

$ curl -D- http://localhost:1234/foo
HTTP/1.1 200 OK
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: application/json
Date: Wed, 29 Jul 2020 20:59:21 GMT

{"data":["out.csv"]}

これは、(ヘッダをダンプします-DSTDOUT(に)-)(のためのルック--dump-header男カール)。

私見もこの文脈で非常に便利です:

私はよくjqを使用して、jsonデータ(たとえば、いくつかのREST APIから)をフォーマットします。ただし、jqはHTTPヘッダーを想定していないため、トリックを使用してヘッダーをstderrに出力し-D/dev/stderrます。今回は-sS(--silent、--show-errors)も使用して、進行状況メーターを抑制していることに注意してください(パイプに書き込むため)。

$ curl -sSD/dev/stderr http://localhost:1231/foo | jq .
HTTP/1.1 200 OK
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: application/json
Date: Wed, 29 Jul 2020 21:08:22 GMT

{
  "data": [
    "out.csv"
  ]
}

これは、ヘッダーを(クイックインスペクションのために)コンソールに出力し、本体をファイルにリダイレクトする場合(たとえば、ある種類のバイナリが端末を台無しにしない場合)にも便利です。

$ curl -sSD/dev/stderr http://localhost:1231 > /dev/null
HTTP/1.1 200 OK
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: application/json
Date: Wed, 29 Jul 2020 21:20:02 GMT

注意:これはと同じではありませんcurl -I <url>-I実行されますHEAD要求していないGETため、要求(ルック--head男カールほとんどのHTTPサーバーでは、これは同じ結果が得られます。しかし、私は実装しないビジネスアプリケーションの多くを知っている:はい。HEADすべての;-Pで要求を


-2
while : ; do curl -sL -w "%{http_code} %{url_effective}\\n" http://host -o /dev/null; done

1
なぜこれをwhileループに入れるのですか?答えを拡大して説明してください。
Uberhumus
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.