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 .