web-dev-qa-db-ja.com

ApacheのHTTPクライアントを使用するときに、HTTP応答を文字列として取得するための推奨される方法は何ですか?

ApacheのHTTPクライアントライブラリを使い始めたばかりで、HTTP応答を文字列として取得する組み込みのメソッドがないことに気づきました。私はそれを文字列として取得して、使用している任意の解析ライブラリに渡すことができるようにしています。

HTTP応答を文字列として取得するための推奨される方法は何ですか?リクエストを作成するためのコードは次のとおりです。

public String doGet(String strUrl, List<NameValuePair> lstParams) {

    String strResponse = null;

    try {

        HttpGet htpGet = new HttpGet(strUrl);
        htpGet.setEntity(new UrlEncodedFormEntity(lstParams));

        DefaultHttpClient dhcClient = new DefaultHttpClient();

        PersistentCookieStore pscStore = new PersistentCookieStore(this);
        dhcClient.setCookieStore(pscStore);

        HttpResponse resResponse = dhcClient.execute(htpGet);
        //strResponse = getResponse(resResponse);

    } catch (ClientProtocolException e) {
        throw e;
    } catch (IOException e) {
        throw e;
    }

    return strResponse;

}
16

これには EntityUtils#toString() を使用できます。

// ...
HttpResponse response = client.execute(get);
String responseAsString = EntityUtils.toString(response.getEntity());
// ...
46
BalusC

応答本文を消費して応答を取得する必要があります。

_BufferedReader br = new BufferedReader(new InputStreamReader(httpresponse.getEntity().getContent()));
_

そしてそれを読んでください:

_String readLine;
String responseBody = "";
while (((readLine = br.readLine()) != null)) {
  responseBody += "\n" + readLine;
}
_

これで、responseBodyに応答が文字列として含まれます。

(最後にBufferedReaderを閉じることを忘れないでください:br.close()

5
Pedro Nunes

次のようなことができます:

Reader in = new BufferedReader(
        new InputStreamReader(response.getEntity().getContent(), "UTF-8"));

リーダーを使用すると、文字列を作成できます。ただし、SAXを使用している場合は、ストリームをパーサーに直接渡すことができます。この方法では、文字列を作成する必要がなく、メモリフットプリントも低くなります。

1
dan

コードの簡潔さに関しては、次のように Fluent API を使用している可能性があります。

import org.Apache.http.client.fluent.Request;
[...]
String result = Request.Get(uri).execute().returnContent().asString();

ただし、このアプローチはメモリ消費の点で理想的ではないことをドキュメントは警告しています。

0
anothernode