Как я могу получить тело ответа HTTP как строку в Java?

Я знаю, что раньше был способ получить его с помощью 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 и получить тело ответа как строку, а не поток?

Ответ 1

Каждая библиотека, о которой я могу думать, возвращает поток. Вы можете использовать IOUtils.toString() из Apache Commons IO для чтения a 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 как лучшее предположение, вместо использования локальной системы по умолчанию.

Ответ 2

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

  • Используя EntityUtils и HttpEntity

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

    HttpResponse response = httpClient.execute(new HttpGet(URL));
    String responseString = new BasicResponseHandler().handleResponse(response);
    System.out.println(responseString);
    

Ответ 3

Вот пример из другого простого проекта, над которым я работал над использованием библиотеки 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, чтобы захватить тело ответа как String. очень просто.

Ответ 4

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

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, чтобы узнать, как это сделать для этого конкретного формата.

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

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

Ответ 5

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

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

Ответ 6

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

org.apache.commons.io.IOUtils.toString(new URL("http://www.someurl.com/"));

Ответ 7

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

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

Затем он предоставит вам незаконноеStateException, в котором говорится, что контент уже потреблен.

Ответ 8

Мы также можем использовать приведенный ниже код, чтобы получить ответ 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);

    }
}

Ответ 9

Вот легкий способ сделать это:

String responseString = "";
for (int i = 0; i < response.getEntity().getContentLength(); i++) { 
    responseString +=
    Character.toString((char)response.getEntity().getContent().read()); 
}

Если, конечно, responseString, содержащий ответ и ответ веб-сайта типа HttpResponse, возвращаемый HttpClient.execute(request)

Ответ 10

Ниже приведен фрагмент кода, который показывает лучший способ обработки тела ответа в виде строки, будь то действительный ответ или ответ об ошибке для запроса HTTP POST:

BufferedReader reader = null;
OutputStream os = null;
String payload = "";
try {
    URL url1 = new URL("YOUR_URL");
    HttpURLConnection postConnection = (HttpURLConnection) url1.openConnection();
    postConnection.setRequestMethod("POST");
    postConnection.setRequestProperty("Content-Type", "application/json");
    postConnection.setDoOutput(true);
    os = postConnection.getOutputStream();
    os.write(eventContext.getMessage().getPayloadAsString().getBytes());
    os.flush();

    String line;
    try{
        reader = new BufferedReader(new InputStreamReader(postConnection.getInputStream()));
    }
    catch(IOException e){
        if(reader == null)
            reader = new BufferedReader(new InputStreamReader(postConnection.getErrorStream()));
    }
    while ((line = reader.readLine()) != null)
        payload += line.toString();
}       
catch (Exception ex) {
            log.error("Post request Failed with message: " + ex.getMessage(), ex);
} finally {
    try {
        reader.close();
        os.close();
    } catch (IOException e) {
        log.error(e.getMessage(), e);
        return null;
    }
}

Ответ 11

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

Ответ 12

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