Как я могу получить тело ответа 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 и получить тело ответа как строку, а не поток?
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, а не использовать локальную систему по умолчанию.
вот два примера из моего рабочего проекта.
используя
EntityUtilsиHttpEntityHttpResponse response = httpClient.execute(new HttpGet(URL)); HttpEntity entity = response.getEntity(); String responseString = EntityUtils.toString(entity, "UTF-8"); System.out.println(responseString);используя
BasicResponseHandlerHttpResponse 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 может использоваться для декодирования данных.
этот ответ зависит от того, что сервер делает правильно - если вы хотите обрабатывать случаи, когда заголовки ответов не соответствуют документу, или объявления документов не соответствуют используемой кодировке, это еще один чайник рыбы.
ответ Макдауэлла является правильным. Однако, если вы попробуете другое предложение в нескольких сообщениях выше.
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