Как получить тело ответа http в виде строки в Java? - PullRequest
133 голосов
/ 24 апреля 2011

Я знаю, что раньше был способ получить его с помощью Apache Commons, как описано здесь: http://hc.apache.org/httpclient-legacy/apidocs/org/apache/commons/httpclient/HttpMethod.html и пример здесь:

http://www.kodejava.org/examples/416.html

но я считаю, что это устарело. Есть ли другой способ сделать http get запрос в Java и получить тело ответа в виде строки, а не потока?

Ответы [ 12 ]

241 голосов
/ 06 декабря 2012

Вот два примера из моего рабочего проекта.

  1. Использование EntityUtils и HttpEntity

    HttpResponse response = httpClient.execute(new HttpGet(URL));
    HttpEntity entity = response.getEntity();
    String responseString = EntityUtils.toString(entity, "UTF-8");
    System.out.println(responseString);
    
  2. Использование BasicResponseHandler

    HttpResponse response = httpClient.execute(new HttpGet(URL));
    String responseString = new BasicResponseHandler().handleResponse(response);
    System.out.println(responseString);
    
90 голосов
/ 24 апреля 2011

Каждая библиотека, о которой я могу думать, возвращает поток.Вы можете использовать IOUtils.toString() из Apache Commons IO , чтобы прочитать InputStream в String в одном вызове метода.Например:

URL url = new URL("http://www.example.com/");
URLConnection con = url.openConnection();
InputStream in = con.getInputStream();
String encoding = con.getContentEncoding();
encoding = encoding == null ? "UTF-8" : encoding;
String body = IOUtils.toString(in, encoding);
System.out.println(body);

Обновление: Я изменил приведенный выше пример, чтобы использовать кодировку содержимого из ответа, если он доступен.В противном случае по умолчанию будет использоваться UTF-8, а не локальная система по умолчанию.

48 голосов
/ 07 марта 2012

Вот пример из другого простого проекта, над которым я работал, используя библиотеку httpclient от Apache:

String response = new String();
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1);
nameValuePairs.add(new BasicNameValuePair("j", request));
HttpEntity requestEntity = new UrlEncodedFormEntity(nameValuePairs);

HttpPost httpPost = new HttpPost(mURI);
httpPost.setEntity(requestEntity);
HttpResponse httpResponse = mHttpClient.execute(httpPost);
HttpEntity responseEntity = httpResponse.getEntity();
if(responseEntity!=null) {
    response = EntityUtils.toString(responseEntity);
}

просто используйте EntityUtils, чтобы получить тело ответа в виде строки.очень просто.

28 голосов
/ 24 апреля 2011

Это относительно просто в конкретном случае, но довольно сложно в общем случае.

HttpClient httpclient = new DefaultHttpClient();
HttpGet httpget = new HttpGet("http://stackoverflow.com/");
HttpResponse response = httpclient.execute(httpget);
HttpEntity entity = response.getEntity();
System.out.println(EntityUtils.getContentMimeType(entity));
System.out.println(EntityUtils.getContentCharSet(entity));

Ответ зависит от Content-Type HTTP-заголовка ответа .

Этот заголовок содержит информацию о полезной нагрузке, и может определять кодировку текстовых данных. Даже если вы предполагаете типы текста , вам может потребоваться проверить сам контент, чтобы определить правильную кодировку символов. например. см. HTML 4 spec для получения подробной информации о том, как сделать это для этого конкретного формата.

Как только кодировка известна, InputStreamReader может использоваться для декодирования данных.

Этот ответ зависит от того, что сервер делает правильно: если вы хотите обрабатывать случаи, когда заголовки ответа не соответствуют документу или объявления документа не соответствуют используемой кодировке, это еще один способ рыба.

10 голосов
/ 12 января 2016

Ниже приведен простой способ доступа к ответу в виде строки с помощью клиентской библиотеки Apache HTTP.

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.BasicResponseHandler;

//... 

HttpGet get;
HttpClient httpClient;

// initialize variables above

ResponseHandler<String> responseHandler = new BasicResponseHandler();
String responseBody = httpClient.execute(get, responseHandler);
9 голосов
/ 22 марта 2012

Как насчет этого?

org.apache.commons.io.IOUtils.toString(new URL("http://www.someurl.com/"));
6 голосов
/ 28 марта 2014

Ответ Макдауэлла правильный.Однако, если вы попробуете другое предложение в нескольких постах выше.

HttpEntity responseEntity = httpResponse.getEntity();
if(responseEntity!=null) {
   response = EntityUtils.toString(responseEntity);
   S.O.P (response);
}

, тогда вы получите исключение invalidStateException о том, что контент уже используется.

2 голосов
/ 26 декабря 2016

Мы также можем использовать приведенный ниже код, чтобы получить HTML-ответ в java

import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.HttpResponse;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import org.apache.log4j.Logger;

public static void main(String[] args) throws Exception {
    HttpClient client = new DefaultHttpClient();
    //  args[0] :-  http://hostname:8080/abc/xyz/CheckResponse
    HttpGet request1 = new HttpGet(args[0]);
    HttpResponse response1 = client.execute(request1);
    int code = response1.getStatusLine().getStatusCode();

    try (BufferedReader br = new BufferedReader(new InputStreamReader((response1.getEntity().getContent())));) {
        // Read in all of the post results into a String.
        String output = "";
        Boolean keepGoing = true;
        while (keepGoing) {
            String currentLine = br.readLine();

            if (currentLine == null) {
                keepGoing = false;
            } else {
                output += currentLine;
            }
        }

        System.out.println("Response-->" + output);
    } catch (Exception e) {
        System.out.println("Exception" + e);

    }
}
0 голосов
/ 05 июля 2019

Если вы используете Джексона для десериализации тела ответа, одно очень простое решение - использовать request.getResponseBodyAsStream() вместо request.getResponseBodyAsString()

0 голосов
/ 21 мая 2019

Вы можете использовать стороннюю библиотеку, которая отправляет запрос Http и обрабатывает ответ.Одним из известных продуктов будет Apache commons HTTPClient: HttpClient javadoc , HttpClient Maven .Существует гораздо менее известный, но гораздо более простой HTTPClient (часть созданной мной библиотеки MgntUtils с открытым исходным кодом): MgntUtils HttpClient javadoc , MgntUtils maven артефакт , MgntUtils Github .Используя любую из этих библиотек, вы можете отправлять свой запрос REST и получать ответ независимо от Spring как часть вашей бизнес-логики

...