5

httpclient に apache httpcompnonents ライブラリを使用しています。スレッド数が非常に多くなり、http 呼び出しが頻繁に発生するマルチスレッド アプリケーションで使用したいと考えています。これは、呼び出しの実行後に応答を読み取るために使用しているコードです。

HttpEntity entity = httpResponse.getEntity();
String response = EntityUtils.toString(entity);

応答を読み取る最も効率的な方法であることを確認したいだけですか?

ありがとう、ヘマント

4

1 に答える 1

20

実際、これはHTTP 応答を処理する最も非効率的な方法です。

ほとんどの場合、応答のコンテンツを一種のドメイン オブジェクトに要約する必要があります。では、文字列の形式でメモリ内にバッファリングするポイントは何ですか?

応答処理に対処するための推奨される方法はResponseHandler、基になる接続からコンテンツを直接ストリーミングしてコンテンツを処理できるカスタムを使用することです。を使用することの追加の利点はResponseHandler、接続の解放とリソースの割り当て解除の処理から完全に解放されることです。

編集: JSON を使用するようにサンプル コードを変更しました

HttpClient 4.2 と Jackson JSON プロセッサを使用した例を次に示します。Stuffは、JSON バインディングを持つドメイン オブジェクトであると想定されます。

ResponseHandler<Stuff> rh = new ResponseHandler<Stuff>() {

    @Override
    public Stuff handleResponse(
            final HttpResponse response) throws IOException {
        StatusLine statusLine = response.getStatusLine();
        HttpEntity entity = response.getEntity();
        if (statusLine.getStatusCode() >= 300) {
            throw new HttpResponseException(
                    statusLine.getStatusCode(),
                    statusLine.getReasonPhrase());
        }
        if (entity == null) {
            throw new ClientProtocolException("Response contains no content");
        }
        JsonFactory jsonf = new JsonFactory();
        InputStream instream = entity.getContent();
        // try - finally is not strictly necessary here 
        // but is a good practice
        try {
            JsonParser jsonParser = jsonf.createParser(instream);
            // Use the parser to deserialize the object from the content stream
            return stuff;
        }  finally {
            instream.close();
        }
    }
};
DefaultHttpClient client = new DefaultHttpClient();
Stuff mystuff = client.execute(new HttpGet("http://somehost/stuff"), rh);
于 2013-07-04T09:10:02.290 に答える