Get response body java

Чтение тела ответа HTTP как строки в Java

В этом руководстве мы рассмотрим несколько библиотек для чтения тела ответа HTTP в виде строки в Java. Начиная с первых версий Java предоставляет API HttpURLConnection . Он включает в себя только основные функции и известен тем, что не очень удобен для пользователя.

В JDK 11 компания Java представила новый и улучшенный API HttpClient для обработки связи по протоколу HTTP. Мы рассмотрим эти библиотеки и проверим альтернативы, такие как Apache HttpClient и Spring Rest Template .

2. HTTP-клиент ​

Как мы упоминали ранее, HttpClient был добавлен в Java 11. Он позволяет нам получать доступ к ресурсам по сети. Но, в отличие от HttpURLConnection , HttpClient поддерживает HTTP/1.1 и HTTP/2 . Более того, он предоставляет как синхронные, так и асинхронные типы запросов .

HttpClient предлагает современный API с большой гибкостью и мощными функциями. В основном этот API состоит из трех основных классов: HttpClient , HttpRequest и HttpResponse .

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

Чтобы прочитать тело ответа в виде строки, нам сначала нужно создать простые объекты клиента и запроса:

 HttpClient client = HttpClient.newHttpClient();   HttpRequest request = HttpRequest.newBuilder()   .uri(URI.create(DUMMY_URL))   .build(); 

Затем мы используем BodyHandlers и вызываем метод ofString() для возврата ответа:

 HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); 

3. HttpURL-соединение ​

HttpURLConnection — это легкий HTTP-клиент, используемый для доступа к ресурсам по протоколу HTTP или HTTPS и позволяющий нам создать InputStream . Получив InputStream, мы можем прочитать его как обычный локальный файл.

В Java основными классами, с которыми мы можем получить доступ к Интернету, являются класс java.net.URL и класс java.net.HttpURLConnection . Во-первых, мы будем использовать класс URL для указания на веб-ресурс. Затем мы можем получить к нему доступ с помощью класса HttpURLConnection .

Чтобы получить тело ответа из URL -адреса в виде строки , мы должны сначала создать HttpURLConnection , используя наш URL -адрес :

 HttpURLConnection connection = (HttpURLConnection) new URL(DUMMY_URL).openConnection(); 

Новый URL(DUMMY_URL).openConnection() возвращает HttpURLConnection . Этот объект позволяет нам добавлять заголовки или проверять код ответа.

Далее, давайте получим InputStream из « объекта подключения :

 InputStream inputStream = connection.getInputStream(); 

4. HTTP-клиент Apache ​

В этом разделе мы увидим, как использовать Apache HttpClient для чтения тела ответа HTTP в виде строки.

Чтобы использовать эту библиотеку, нам нужно добавить ее зависимость в наш проект Maven:

 dependency>   groupId>org.apache.httpcomponentsgroupId>   artifactId>httpclientartifactId>   version>4.5.12version>   dependency> 

Мы можем получать и отправлять данные через класс CloseableHttpClient . Чтобы создать его экземпляр с конфигурацией по умолчанию, мы можем использовать HttpClients.createDefault() .

CloseableHttpClient предоставляет метод выполнения для отправки и получения данных. Этот метод использует параметр типа HttpUriRequest , который имеет множество подклассов, включая HttpGet и HttpPost .

Давайте сначала создадим объект HttpGet :

 HttpGet request = new HttpGet(DUMMY_URL); 

Во-вторых, давайте создадим клиент :

 CloseableHttpClient client = HttpClients.createDefault(); 

В- третьих, мы извлекаем объект ответа из результата метода execute :

 CloseableHttpResponse response = client.execute(request); 

Наконец, мы возвращаем тело ответа, преобразуя объект ответа в String :

 HttpEntity entity = response.getEntity();   String result = EntityUtils.toString(entity); 

5. Шаблон Spring Rest ​

В этом разделе мы увидим, как использовать Spring RestTemplate для чтения тела ответа HTTP в виде строки. Мы должны отметить, что RestTemplate теперь устарел : мы должны рассмотреть возможность использования Spring WebClient, как описано в следующей главе.

Класс RestTemplate — это важный инструмент, предоставляемый Spring, который предлагает простой шаблон для выполнения операций HTTP на стороне клиента над базовыми клиентскими библиотеками HTTP, такими как JDK HttpURLConnection , Apache HttpClient и другие.

RestTemplate предоставляет несколько полезных методов для создания HTTP-запросов и обработки ответов.

Мы можем использовать эту библиотеку, предварительно добавив некоторые зависимости в наш проект Maven:

 dependency>   groupId>org.springframework.bootgroupId>   artifactId>spring-boot-starter-webartifactId>   version>$ version>   dependency>   dependency>   groupId>org.springframework.bootgroupId>   artifactId>spring-boot-starter-testartifactId>   version>$ version>   scope>testscope>   dependency> 

Чтобы сделать веб-запрос и вернуть тело ответа в виде строки, давайте сначала создадим экземпляр RestTemplate :

 RestTemplate restTemplate = new RestTemplate(); 

Во- вторых, мы получаем объект ответа, вызывая метод getForObject() , передавая URL-адрес и желаемый тип ответа — в нашем примере мы будем использовать String.class :

 String response = restTemplate.getForObject(DUMMY_URL, String.class); 

6. Весенний веб-клиент​

Наконец, мы увидим, как использовать Spring WebClient, реактивное, неблокирующее решение, заменяющее Spring RestTemplate .

Мы можем использовать эту библиотеку, сначала добавив зависимость spring-boot-starter-webflux в наш проект Maven:

 dependency>   groupId>org.springframework.bootgroupId>   artifactId>spring-boot-starter-webfluxartifactId>   dependency> 

Самый простой способ выполнить HTTP-запрос Get — использовать метод create:

 WebClient webClient = WebClient.create(DUMMY_URL); 

Самый простой способ выполнить HTTP-запрос Get — вызвать методы получения и извлечения . Затем мы будем использовать метод bodyToMono с типом String.class , чтобы извлечь тело как один экземпляр String:

 MonoString> body = webClient.get().retrieve().bodyToMono(String.class); 

Наконец, давайте вызовем метод блока , чтобы указать веб-потоку ждать, пока весь основной поток не будет прочитан и скопирован в результат String:

7. Заключение​

В этой статье мы увидели, как использовать несколько библиотек для чтения тела ответа HTTP в виде строки .

Как обычно, полный код доступен на GitHub .

Источник

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

Я знаю, что раньше был способ получить его с помощью apache commons, как описано здесь: http://hc.apache.org/httpclient-legacy/apidocs/org/apache/commons/httpclient/HttpMethod.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

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

HttpResponse response = httpClient.execute(new HttpGet(URL)); HttpEntity entity = response.getEntity(); String responseString = EntityUtils.toString(entity, "UTF-8"); System.out.println(responseString); 
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 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)

просто используйте 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 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)

Затем он предоставит вам незаконное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

Если, конечно, 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()

Источник

Читайте также:  Php mysql javascript css o reilly
Оцените статью