curlを使用してHTTP POSTから応答ヘッダーのみを取得する


561

一つは、オプションとして、HTTP HEADを使用してヘッダーだけを要求することができます-Iの中でcurl(1)

$ curl -I /

長いHTML応答本文はコマンドラインで取得するのが面倒なので、POSTリクエストのフィードバックとしてヘッダーのみを取得したいと思います。ただし、HEADとPOSTは2つの異なる方法です。

curlでPOSTリクエストへの応答ヘッダーのみを表示するにはどうすればよいですか?

回答:


773
-D, --dump-header <file>
       Write the protocol headers to the specified file.

       This  option  is handy to use when you want to store the headers
       that a HTTP site sends to you. Cookies from  the  headers  could
       then  be  read  in  a  second  curl  invocation by using the -b,
       --cookie option! The -c, --cookie-jar option is however a better
       way to store cookies.

そして

-S, --show-error
       When used with -s, --silent, it makes curl show an error message if it fails.

そして

-L/--location
      (HTTP/HTTPS) If the server reports that the requested page has moved to a different location (indicated with a Location: header and a 3XX response
      code), this option will make curl redo the request on the new place. If used together with -i/--include or -I/--head, headers from  all  requested
      pages  will  be  shown.  When authentication is used, curl only sends its credentials to the initial host. If a redirect takes curl to a different
      host, it won’t be able to intercept the user+password. See also --location-trusted on how to change this. You can limit the amount of redirects to
      follow by using the --max-redirs option.

      When curl follows a redirect and the request is not a plain GET (for example POST or PUT), it will do the following request with a GET if the HTTP
      response was 301, 302, or 303. If the response code was any other 3xx code, curl will re-send the following  request  using  the  same  unmodified
      method.

マニュアルページから。そう

curl -sSL -D - www.acooke.org -o /dev/null

リダイレクトに従い、ヘッダーをstdoutにダンプし、データを/ dev / nullに送信します(これはPOSTではなくGETですが、POSTで同じことを実行できます-データのPOSTにすでに使用しているオプションを追加するだけです)。

出力の「ファイル」がstdoutであることを示すの-後ろに注意してください-D


22
上記のコメントは、powershellを使用している場合に有効です。cmd.exeの使用curl -s -D - http://yahoo.com -o nul
JJS 2013

1
@JJS for me $ nullはWin7で動作しました。それはWindowsにインストールされているcLinkによるものですか?
サティヤプラカーシュ2013

17
URLの前の「-」は重要ではないように見えるかもしれませんが、重要ではありません。
Wahid Sadik 2013年

1
@WahidSadikなぜ特にそうなのですか?シングルダッシュの機能は何ですか?
mamachanko 2013年

4
@mamachanko -Dは、出力先を示す引数を取ります。単一のダッシュは、標準出力に行く必要があることを意味します。
アンドリュークック2013年

172

その他の回答では、応答本文をダウンロードする必要があります。ただし、ヘッダーのみをフェッチするPOSTリクエストを作成する方法があります。

curl -s -I -X POST http://www.google.com

-Iそれ自体ではによって無効にすることができるHEAD要求を行う-X POSTPOST(または任意の他の)要求を実行するために、まだのみヘッダデータを取得します。


15
Webサーバーは要求メソッドに基づいて異なるヘッダーを返すことができるため、この答えは実際には正しいです。GETでヘッダーを確認する場合は、GETリクエストを使用する必要があります。
chhantyal

6
これは私の意見では最も正しい答えです。覚えやすいです。実際にGETリクエストを送信し、レスポンスボディ全体をダウンロードしません(または少なくとも出力しません)。-sフラグがも必要です。
skozin

@JeffPuckettIIまあまあ私は言うだろう。あなたは置き換えることができGETPOST上記のコマンドにし、期待どおりに動作します。or any otherそこに鍵があります。
チャンティアル

18
これは、実際にPOST一部のデータが必要な場合は機能しません。カールさんのコメント:Warning: You can only select one HTTP request method! You asked for both POST Warning: (-d, --data) and HEAD (-I, --head).
SebastianH

2
@nickboldtここでのポイントは、サーバーがPOSTまたはGET要求に対するHEAD要求への応答とは異なる可能性がある(そして一部のサーバーは実際にそれを行う)ため、ここで-X HEADは信頼できる解決策ではありません。
シラクサ2017年

58

次のコマンドは、追加情報を表示します

curl -X POST http://httpbin.org/post -v > /dev/null

完全な応答ではなく、HEADのみを送信するようサーバーに要求できます

curl -X HEAD -I http://httpbin.org/

Note:場合によっては、サーバーがpostとHEADに異なるヘッダーを送信することがあります。しかし、ほとんどの場合、ヘッダーは同じです。


5
これは正解です-大量のデータを不必要に転送しないため、他の答えが勝ったのは残念です。
ダニエル

1
@dmd cURLのマニュアルを-X, --request正しく理解している場合-X HEADでも、「大量のデータ」が生成さ-I, --headれますが、期待どおりの結果が得られるはずです。
Daniel AR Werner

1
あなたはそれを正しく理解していません。 -X HEAD-Iまったく同じです。
ダニエル

18
通報-X HEADそれが今で受信するので、サーバーは、異なる応答かもしれないということであるHEAD要求の代わりにGET(または任意の前の要求だったが)
GRAV

4
Warning: Setting custom HTTP method to HEAD with -X/--request may not work the Warning: way you want. Consider using -I/--head instead.
ドリアン

53

長い応答本体(および他のさまざまな類似の状況)の場合、私が使用する解決策は常ににパイプするlessことです。

curl -i https://api.github.com/users | less

または

curl -s -D - https://api.github.com/users | less

仕事をします。


これらは同等ではありません。最初は、HEAD多くのサーバーが異なる応答をする要求を発行します。2番目GETは、ここで探しているものに似たリクエストを発行します。
glasz

25

多分それは少し極端ですが、私はこの超短いバージョンを使用しています:

curl -svo. <URL>

説明:

-v デバッグ情報を出力します(ヘッダーを含みます)

-o.Webページのデータ(無視したい)を特定のファイル(.この場合はディレクトリであり、宛先が無効であり、出力を無視する)に送信します。

-sプログレスバーなし、エラー情報なし(そうしないと表示されますWarning: Failed to create the file .: Is a directory

警告:結果は常に失敗します(到達可能かどうかにかかわらず、エラーコードに関して)。シェルスクリプトの条件ステートメントなどでは使用しないでください...


1
-o.代わりになぜ使用するの-o /dev/nullですか?
bfontaine

@bfontaine -o.-o /dev/null簡潔にするために使用されています
exebook

これは同じ動作をしないため、8文字を節約するためだけに使用するのは奇妙です。
bfontaine

2
@bfontaineこれを最も正しい方法で行う方法を示す他の回答があります。これは、基本的に同じことを行う短い代替手段を示すためにここにあります。
exebook 2007

このコマンドは常に失敗することを回答で明確にする必要があります。makeがゼロ以外(=エラー)のコードを返すため、curl -svo. <url> && echo foo印刷されません。foo-o.curlcurl: (23) Failed writing body
bfontaine


14

他の答えはすべての状況でうまくいくわけではありませんが、私が見つけることができる最善の解決策(POST同様に働く)は、ここから取得しました

curl -vs 'https://some-site.com' 1> /dev/null


1
これを機能させるには、引用符の間にURLを挿入する必要がありました。
クリストフワイス2017

1
これが必要かどうかは、URLと使用するシェルによって異なる場合があります。私はそれに応じて答えを改善しました。ありがとう。
Daniel AR Werner

3

headcurl.cmd(Windowsバージョン)

curl -sSkv -o NUL %* 2>&1
  • プログレスバーは必要ありません-s
  • しかし、私はエラーが必要です-S
  • 有効なhttps証明書を気にしない-k
  • 冗長性が高くなります-v(これはトラブルシューティングに関するものです)。
  • 出力はありません(クリーンな方法で)。
  • ああ、そして私はstderrstdout転送したいので、全体に対してgrepできます(ほとんどまたはすべての出力がstderrにあるため)
  • %*[このスクリプトにすべてのパラメーターを渡す]を意味します(well(https://stackoverflow.com/a/980372/444255)、まあ通常は1つのパラメーターだけです:テストしているURL

実際の例(プロキシの問題のトラブルシューティング):

C:\depot>headcurl google.ch | grep -i -e http -e cache
Hostname was NOT found in DNS cache
GET HTTP://google.ch/ HTTP/1.1
HTTP/1.1 301 Moved Permanently
Location: http://www.google.ch/
Cache-Control: public, max-age=2592000
X-Cache: HIT from company.somewhere.ch
X-Cache-Lookup: HIT from company.somewhere.ch:1234

Linuxバージョン

あなたのために.bash_aliases/ .bash_rc

alias headcurl='curl -sSkv -o /dev/null $@  2>&1'

これにより本体がダウンロードされ、帯域幅と時間が消費されます。@siracusaの回答(stackoverflow.com/a/38679650/6168139)には、このオーバーヘッドはありません。
rushi

&POSTが必要な場合-X POSTはパススルーパラメータに追加し、GETが必要な場合はGET(つまりデフォルト)を使用します。応答が異なる場合があるためです。-プロダクションスクリプトで大量のカーリングを行わない限り(診断および開発用ではありません)、帯域幅は少しでも構いません。
Frank Nocke

サーバー上のファイルが更新されているか、または「最終更新」を使用していないかを確認することを計画しています。ファイル自体は大きく、一部はGBであり、私は通常、携帯電話のインターネットを利用しています。したがって、この大きな帯域幅は私にとって問題です。
rushi

それはハッキーだろう。シラクサの答えが正確にタスクを実行するので、私はこれを行う必要はありません。
rushi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.