Http response java string

Выполнение запроса с помощью HttpClient

Ты закончил изучать, как формировать http-запрос, значит можно переходить к самому главному – отправке этого запроса. В самом простом случае это сделать легко:

 HttpRequest request = HttpRequest.newBuilder(new URI("https://javarush.com")).build(); HttpClient client = HttpClient.newBuilder() .version(Version.HTTP_1_1) .build(); HttpResponse response = client.send(request, BodyHandlers.ofString()); System.out.println(response.statusCode() ); System.out.println(response.body() ); 

А что это за BodyHandlers такие? А как ты думаешь? Ты отправил запрос, а значит вам должен прийти ответ – http response . И у этого ответа может быть response body : строка, файл, массив байт, InputStream.

Да, да, все верно. Так же, как и при формировании запроса, тебе нужно указать тип response body у ответа. Всего их может быть 8 штук:

В зависимости от того, какой тип BodyHandlers ты передал в метод send() , такой тип результата он и вернет. Пример:

 // response body игнорируется HttpResponseVoid> response = client.send(request, BodyHandlers.discarding()); 
 // response body это строка HttpResponseString>response = client.send(request, BodyHandlers.ofString()); 
 // response body это файл HttpResponsePath> response = client.send(request, BodyHandlers.ofFile(Paths.get("readme.txt"))); 
 // response body это InputStream HttpResponseInputStream> response = client.send(request, BodyHandlers.ofInputStream()); 

Если в качестве ответа тебе должны прислать файл, то в метод BodyHandlers.ofFile() тебе нужно передать имя локального файла, куда он будет сохранен объектом HttpClient.

4.2 Метод followRedirects()

Также при отправке запроса ты можешь указать, что делать HttpClient’у, если сервер в ответ пришлет 301 или 302 (временный или постоянный редирект). Представь, что сервер прислал код 302 , и тебе нужно: отследить эту ситуацию, получить новый URL из ответа и отправить запрос по новому адресу.

Не сильно бы хотелось таким заниматься, особенно учитывая, что эта ситуация встречается часто и уже давно автоматизирована во всех http-клиентах. Также и в этом HttpClient’е тебе нужно просто указать какой режим редиректа ты выбираешь при отправке запроса.

 HttpResponse response = HttpClient.newBuilder() .followRedirects( HttpClient.Redirect.ALWAYS ) .build() .send(request, BodyHandlers.ofString()); 

Есть всего 3 варианта для редиректа:

Как видишь, вариантов тут немного, но всегда лучше иметь возможность настройки, чем не иметь ее.

4.4 Метод proxy()

Есть еще пара полезных, но не часто используемых опций. Они тебе не нужны ровно до тех пор, пока не станут нужны 🙂

Первый – это proxy. В обычной жизни ты не часто сталкиваешься с ними, но многие крупные корпорации имеют у себя внутри сложную систему безопасности интернет-трафика, а значит и различные настройки proxy.

Ну, и конечно, твой софт, который будет работать где-то в недрах такой корпорации когда-то столкнется с тем, что ему нужно будет задействовать proxy. Поэтому хорошо, что такая опция тут тоже есть.

Читайте также:  Вертикальное адаптивное многоуровневое меню css

Настроить прокси очень просто – пример:

 HttpResponse response = HttpClient.newBuilder() .proxy( ProxySelector.getDefault()) .build() .send(request, BodyHandlers.ofString()); 

Тут был выбран proxy по умолчанию, но ты можешь захотеть настроить свой:

 HttpResponse response = HttpClient.newBuilder() .proxy(ProxySelector.of(new InetSocketAddress("proxy.microsoft.com", 80))) .build() .send(request, BodyHandlers.ofString()); 

Как именно работать с proxy мы рассматривать не будем, так как это не входит в рамки данного курса.

4.5 authenticator()

И еще один важный момент. HTTP-протокол поддерживает аутентификацию. Прямо на уровне протокола.

Сейчас таким подходом почти не пользуются, но лет 20 назад он был распространен. Выглядел такой Http-запрос так:

 http://username:password@example.com/ 

Это не почта. Это именно ссылка. И да, тебе не показалось. Логин и даже пароль можно было указать прямо в http-запросе. Да и сейчас можно. Поэтому я и пишу, что сейчас так обычно никто не делает. Но такая возможность есть.

 Authenticator auth = new Authenticator() < @Override protected PasswordAuthentication getPasswordAuthentication() < return new PasswordAuthentication( "username", "password".toCharArray()); >>; HttpResponse response = HttpClient.newBuilder() .authenticator(auth).build() .send(request, BodyHandlers.ofString()); 

Это интересно! Знаете почему вместо “password» в коде написано «password».toCharArray() ?

Потому что второй параметр конструктора PasswordAuthentication – не String , а CharArray .

А почему второй параметр не String , а CharArray ?

Потому что все пароли в целях безопасности запрещается хранить в виде целой строки даже в своем собственном приложении . То есть ваше приложение в своей памяти не должно хранить пароль в виде строки. Чтобы если кто-то сделал damp-памяти, из него нельзя было вытащить пароль…

Но при этом пароль можно передать по незащищенному HTTP-протоколу через полмира 🙂 🙂 🙂

Более детально ты можешь ознакомиться с этой темой по ссылкам:

Источник

Чтение тела ответа 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 .

Читайте также:  Java string args input

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 .

Источник

How do I get HTTP response body as a string?

This example show you how to get HTTP response body as a string when using the Apache HttpComponents library. To get the response body as a string we can use the EntityUtils.toString() method. This method read the content of an HttpEntity object content and return it as a string. The content will be converted using the character set from the entity object.

Let’s see the code snippet below:

package org.kodejava.apache.http; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.util.EntityUtils; import java.io.IOException; public class EntityAsString < public static void main(String[] args) < try (CloseableHttpClient client = HttpClientBuilder.create().build()) < HttpGet request = new HttpGet("https://kodejava.org"); HttpResponse response = client.execute(request); HttpEntity entity = response.getEntity(); // Read the contents of an entity and return it as a String. String content = EntityUtils.toString(entity); System.out.println(content); >catch (IOException e) < e.printStackTrace(); >> > 

Maven Dependencies

 org.apache.httpcomponents httpclient 4.5.14  

A programmer, recreational runner and diver, live in the island of Bali, Indonesia. Programming in Java, Spring, Hibernate / JPA. You can support me working on this project, buy me a cup of coffee ☕ every little bit helps, thank you 🙏

Источник

Оцените статью