0

サーバレスポンスボディは "[]"で、Content-Length = 0.クライアントが上記応答ボディを読み込もうとすると、常に "-1"を返します。また、私がサーバーレスポンスを傍受し、Content-Lengthを "2"に変更すると、すべて動作します。 Content-Length = 0のときにapache httpクライアントが-1を返しますが、実際にレスポンスボディが空ではないという結論を出すことができます。 Content-lengthが間違っていてもレスポンス本文を読むことができる回避策を探しています。つまり、Content-Lengthヘッダーの値を無視するようにhttpクライアントを設定できますか?サーバーを変更する機会がなく、何らかの理由でHttpUrlConnectionを使用することができません。してください、任意の提案。apache httpクライアントで0のコンテンツ長ヘッダを無視する方法

答えて

1

障害のある問題Content-lengthは、HttpClientが応答が終了したときを認識しないため、キープアライブ接続の場合にこの接続を介して次の要求を中断します。 最も簡単な方法は、org.apache.http.impl.entity.LaxContentLengthStrategyを拡張し、ヘッダーが "0"のときに内容の長さ "2"を返すようにします。ただし、長さが実際に0の場合、スレッドは待機しますソケットからの続きを読む:

のHttpClientには少しトリッキーかもしれません設定そのうち
class MyLaxContentLengthStrategy extends LaxContentLengthStrategy{ 
    public long determineLength(final HttpMessage message) throws HttpException { 
     final Header contentLengthHeader = message.getFirstHeader(HTTP.CONTENT_LEN); 
     if (contentLengthHeader != null) { 
      long contentlen = -1; 
      final Header[] headers = message.getHeaders(HTTP.CONTENT_LEN); 
      for (int i = headers.length - 1; i >= 0; i--) { 
       final Header header = headers[i]; 
       try { 
        contentlen = Long.parseLong(header.getValue()); 
        break; 
       } catch (final NumberFormatException ignore) { 
       } 
       // See if we can have better luck with another header, if present 
      } 
      if (contentlen == 0) { 
       return 2; 
      } 
     } 
     return super.determineLength(message); 
    } 
} 

http://mail-archives.apache.org/mod_mbox/hc-httpclient-users/201301.mbox/%[email protected]%3E それは非常に簡単です4.4ので:

ManagedHttpClientConnectionFactory cliConnFactory = new ManagedHttpClientConnectionFactory(
      null, null, null, 
      new MyLaxContentLengthStrategy()); 

PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(cliConnFactory); 
HttpClients.custom 
..... 
.setConnectionManager(cm) 
.build(); 

だから、あなたが実際に必要としない場合"[]"を含む本体を使用すると、この接続を閉じるようにHttpClientに指示できます。失敗した応答を放棄する。あなたはこのように設定することができます

class MyConnectionReuseStrategy extends DefaultClientConnectionReuseStrategy{ 
    @Override 
    public boolean keepAlive(final HttpResponse response, final HttpContext context) { 
     final HttpRequest request = (HttpRequest) context.getAttribute(HttpCoreContext.HTTP_REQUEST); 
     if (request != null) { 
      final Header[] contLenHeaders = request.getHeaders(HttpHeaders.CONTENT_LENGTH); 
      for(Header h : contLenHeaders){ 
       if("0".equalsIgnoreCase(h.getValue())){ 
        return false; 
       } 
      } 
     } 
     return super.keepAlive(response, context); 
    } 

} 

:これは、このようなものでorg.apache.http.impl.client.DefaultClientConnectionReuseStrategyをオーバーライドすることによって行うことができます

HttpClients.custom 
     ..... 
     .setConnectionReuseStrategy(new MyConnectionReuseStrategy()) 
     .build(); 
関連する問題