Перейти к основному содержимому

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

· 5 мин. чтения

1. Введение

В этом руководстве мы рассмотрим несколько библиотек для чтения тела ответа 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();

Наконец, нам нужно преобразовать InputStream в String .

4. HTTP-клиент Apache

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

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

<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.12</version>
</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.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>${spring-boot.version}</version>
<scope>test</scope>
</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.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

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

WebClient webClient = WebClient.create(DUMMY_URL);

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

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

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

String s = body.block();

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

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

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