2

ThreadSafeClientConnManager(Apache httpcomponents 4.1.1)によって作成された接続を使用しています。response.getEntity()。isChunked()によって決定されるように、応答はチャンク化されます(これは私が期待しています)。

ただし、フッター/トレーラー(アプリケーションに必要)を取得する方法はありません。応答がチャンク化されているため、エンティティの内容はChunkedInputStreamタイプであると予想されますが、クライアントが使用するデフォルトのリクエストディレクタークラスとエグゼキュータークラスは、元の応答エンティティをラップします(httpcomponentsソースを見るとChunkedInputStreamでした)。 BasicManagedEntity内。

つまり、BasicManagedEntityは基になるエンティティを使用できるようにしないため、応答からフッター/トレーラーを削除できなくなりました。誰かがこれを回避する方法を知っていますか?

参考までに、以下を参照してください。

  • org.apache.http.impl.client.DefaultRequestDirector.java、行523-525
  • org.apache.http.impl.entity.EntityDeserializer.java、93〜96行目
4

2 に答える 2

3

チャンクされたコンテンツストリームと応答フッターにアクセスするために、HTTP応答インターセプターを使用できます。

httpclient.addResponseInterceptor(new HttpResponseInterceptor() {

public void process(
        final HttpResponse response,
        final HttpContext context) throws HttpException, IOException {
    HttpEntity entity = response.getEntity();
    if (entity != null) {
        InputStream instream = entity.getContent();
        if (instream instanceof ChunkedInputStream) {
            Header[] footers = ((ChunkedInputStream) instream).getFooters();
        }
    }
}

});

于 2011-07-08T11:40:49.203 に答える
0

回答で説明されているように、これは非推奨のDefaultHttpClientを使用するときに実行できます。非推奨ではない新しいHttpClientには、バージョン4.5でトレーラーにアクセスできないバグhttps://issues.apache.org/jira/browse/HTTPCLIENT-1992があります。このバグは5.0で修正されています

したがって、v4.5では、以下は機能しません。

 CloseableHttpClient httpclient = HttpClients.custom().addInterceptorFirst(
            (org.apache.http.HttpResponse response, HttpContext context) -> {
                InputStream instream = response.getEntity().getContent();
                if (instream instanceof ChunkedInputStream) {
                    //Code will never run for v4.5
                }
            }
    ).build();
于 2021-02-09T06:41:38.840 に答える