Как я могу получить тело ответа 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 и получить тело ответа как строку, а не stream?
- JAX-RS Сообщение нескольких объектов
- Java Hashmap: как получить ключ от стоимости?
- подключение к общей папке в windowsх с помощью java
- Как сделать анимацию линии более гладкой?
- Внедрить EJB в JAX-RS (служба RESTful)
- сделать JLabel обернуть его текстом, установив максимальную ширину
- Невозможно скомпилировать простой проект Java 10 с Maven
- SwingWorker не обновляет JProgressBar без Thread.sleep () в пользовательской диалоговой панели
- Почему java.util.concurrent.ArrayBlockingQueue использует «while» вместо «if» вокруг вызовов для ожидания ()?
- Как работает побитовая и (И) на Java?
- Может кто-нибудь, пожалуйста, объясните mappedBy в спящем режиме?
- Решить проблему Liby-Hibernate с помощью hibernate.enable_lazy_load_no_trans
- Есть ли хороший способ иметь карту Получить и положить игнорировать случай?
Каждая библиотека, о которой я могу думать, возвращает stream. Вы можете использовать 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
и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);
Вот пример из другого простого проекта, над которым я работал над использованием библиотеки httpclient от Apache:
String response = new String(); List nameValuePairs = new ArrayList (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. очень просто.
Это относительно просто в конкретном случае, но довольно сложное в общем случае.
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));
Ответ зависит от заголовка ответа HTTP Content-Type
.
Этот заголовок содержит информацию о полезной нагрузке и может определять кодировку текстовых данных. Даже если вы принимаете текстовые типы , вам может потребоваться проверить сам контент, чтобы определить правильную кодировку символов. Например, см. Спецификацию HTML 4, чтобы узнать, как это сделать для этого конкретного формата.
Как только кодирование известно, InputStreamReader может использоваться для декодирования данных.
Этот ответ зависит от того, как сервер делает правильные вещи – если вы хотите обрабатывать случаи, когда заголовки ответов не соответствуют документу, или объявления документа не соответствуют используемой кодировке, это еще один чайник из рыбы.
Как насчет этого?
org.apache.commons.io.IOUtils.toString(new URL("http://www.someurl.com/"));
Ответ Макдауэлла правильный. Однако, если вы попробуете другое предложение в нескольких сообщениях выше.
HttpEntity responseEntity = httpResponse.getEntity(); if(responseEntity!=null) { response = EntityUtils.toString(responseEntity); SOP (response); }
Затем он предоставит вам незаконноеStateException, в котором говорится, что контент уже потреблен.
Ниже приведен простой способ доступа к ответу в виде строки с использованием 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 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)