Как я могу получить тело ответа 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 и получить тело ответа как строку, а не поток?

592   9  

9 ответов:

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

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

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

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

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

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 может использоваться для декодирования данных.

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

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

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

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

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

тогда это даст вам illegalStateException о том, что контент уже потребляется.

Ниже приведен простой способ доступа к ответу в виде строки с помощью клиентской библиотеки 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);

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

    }
}

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

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

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

Comments

    Ничего не найдено.