実際、これは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);