2012-01-13 1 views
9

私のコードでは、いくつかのファイルをストリームとしてダウンロードするためにHttp Getリクエストを使用します。私は次のコードを使用します:HTTP Get:ヘッダのみをダウンロードしますか? (HEADはサポートされていません)

public String getClassName(String url) throws ClientProtocolException, IOException { 
     HttpResponse response = sendGetRequestJsonText(url); 

     Header[] all = response.getAllHeaders(); 
     for (Header h : all) { 
      System.out.println(h.getName() + ": " + h.getValue()); 
     } 

     Header[] headers = response.getHeaders("Content-Disposition"); 
     InputStreamParser.convertStreamToString(response.getEntity().getContent()); 
     String result = ""; 
     for (Header header : headers) { 
      result = header.getValue(); 
     } 
     return result.substring(result.indexOf("''") + "''".length(), result.length()).trim(); 
    } 

しかし、これは応答の完全な内容をダウンロードします。私はコンテンツなしでHTTPヘッダーだけを取得したい。 HEAD要求は機能していないようですが、ステータス501を取得して実装されていないためです。どうやってやるの?

+1

レスポンスボディを読み取れませんか? – irreputable

+0

@irreputableもし私が知っていればこれを行うでしょう; –

+1

'InputStreamParser.convertStreamToString(response.getEntity()。getContent());'はエンティティを読み込んでいます。あなたはおそらくそれをしないでしょうか? –

答えて

17

代わりのGET要求を行う、あなただけHEAD要求することを検討可能性があります

HEADメソッドは、サーバが 応答メッセージボディを返してはならないことを除いて、GETと同じですが。ヘッダー要求に応答して、HTTPヘッダーの を含むメタ情報は、GET要求に応答して送信された情報に同じ と同じである必要があります(SHOULD)。この方法は、 要求によって暗示されたエンティティに関するメタ情報をエンティティ本体自体を転送することなく取得するために使用することができる( )。このメソッドは、有効性、アクセシビリティ、 および最近の変更についてハイパーテキストリンクをテストするためによく使用される です。

+0

これを試しましたが、ヘッダーが今とは違って見えます:(私は再度チェックし、ステータスコードは501で実装されていません。他の可能性はありますか? – RoflcoptrException

+0

@Roflcoptr - それは不自由です。あなたは['Range'](http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35)ヘッダーエンティティの0から0の範囲を要求することができますが、私は決して 'Range'ヘッダや部分的なレスポンスを使用していないので、実際にはそれを話すことはできません。 –

+0

今のところ私は回避策を見つけました。要求を出しましたが、ヘッダーを受信すると直ちに中止を呼び出しました。これは良い練習ですか? – RoflcoptrException

5

リクエストでRange headerを使用して、レスポンスエンティティに含める範囲を指定することができます。おそらくのようなもの:それは仕事をしている場合

Range: bytes=0-0 

は、あなたが応答エンティティに存在するあなたのRangeヘッダーで指定されたバイトの206 Partial Contentをバック受け取るべきです。しかし、私はこれを試していませんでした、そしてそれはまた、動作するようにを保証ではありません。

サーバがRangeヘッダを無視するかもしれません。

+1

サーバーがRangeを実装していてHEADを実装していないのはどうですか?また、範囲0-0は1バイトをカバーします。 – irreputable

+0

@irreputable - うん、これも私の考えだ。実装されていない 'HEAD'を指定すると、サーバはこれを利用できない可能性があります。 1バイトのものに関しては、RFE2616(セクション14.35.1)は次のように述べています:* "last-byte-pos値が存在する場合、それは**より大きいか、または**と等しい**その中のfirst-byte-pos byte-range-specであるか、またはbyte-range-specが構文的に無効です。 "* - 私にとって、これは0バイトの範囲が有効であることを示します。 –

+1

0-0は有効ですが、0バイト目の1バイトを意味します。0バイトを要求することはできません。 206応答は0バイトを返すことはできません。それは本当にちょっと奇妙です。実際には0バイトを要求することは有用ではありません。これを行うことができないということは、プログラマーの本能に反します。 – irreputable

関連する問題