Каков рекомендуемый способ получить ответ HTTP в виде строки при использовании HTTP-клиента Apache?

Я только начал использовать библиотеку Apache HTTP Client и заметил, что не было встроенного метода получения HTTP-ответа в виде строки. Я просто хочу получить его как String, чтобы я мог передать его любой библиотеке синтаксического анализа, которую я использую.

Каков рекомендуемый способ получения ответа 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;

}

person Mridang Agarwalla    schedule 23.08.2012    source источник


Ответы (4)


Вы можете использовать EntityUtils#toString() для этого.

// ...
HttpResponse response = client.execute(get);
String responseAsString = EntityUtils.toString(response.getEntity());
// ...
person BalusC    schedule 23.08.2012
comment
этот ответ - путь для HttpClient. На мой взгляд, с Apache Jersey намного проще работать, чем с HttpClient. - person Paul Sanwald; 24.08.2012
comment
@Paul: я не уверен, что вы имеете в виду под Apache Jersey. В проекте Apache такого нет. Jersey — это эталонная реализация Sun/Oracle API JAX-RS, которая вообще не является HTTP-клиентом. - person BalusC; 24.08.2012
comment
извините, я имел в виду майку солнца/оракула. он содержит http-клиент с более плавным API. - person Paul Sanwald; 24.08.2012

Вам нужно использовать тело ответа и получить ответ:

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())

person Pedro Nunes    schedule 23.08.2012

Вы можете сделать что-то вроде:

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

Используя ридер, вы сможете построить свою строку. Но если вы используете SAX, вы можете передать поток парсеру напрямую. Таким образом, вам не нужно будет создавать строку, и ваш объем памяти также будет меньше.

person dan    schedule 23.08.2012

С точки зрения краткости кода это может быть использование Fluent API примерно так:

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

Однако документация предупреждает, что этот подход не идеален с точки зрения потребления памяти.

person anothernode    schedule 25.07.2017