Методы newBuilder(), build()

Класс HttpRequеst используется для описания http-request, что легко понять из его названия. Этот объект сам по себе ничего не делает, он только содержит разнообразную информацию по поводу http-запроса. Поэтому, как ты уже, наверное, догадываешься, для его создания тоже используется шаблон Builder.


HttpRequest request = HttpRequest.newBuilder()
	.method1()
	.method2()
	.methodN()
    .build();

Где между вызовами методов newBuilder() и build() нужно вызвать все методы для конструирования объекта HttpRequest.

Пример простейшего запроса выглядит так:


HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create(“http://javarush.ru”))
    .build();
HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString());

Все методы класса HttpRequest ты можешь найти по ссылке в официальной документации.

А дальше мы разберем самые популярные из них.

Метод uri()

С помощью метода uri() можно задать URI (или URL), к которому будет отправлен http-запрос. Пример:


HttpRequest request = HttpRequest.newBuilder()
    .uri( URI.create(“http://javarush.ru”) )
    .build();

Кстати, можно записать этот код еще немного короче, передав URI прямо в метод newBuilder():


HttpRequest request = HttpRequest.newBuilder( URI.create(“http://javarush.ru”) ).build();  

Важно! URI можно создать двумя способами:

  • new URI(String)
  • URI.create(String)

Второй способ предпочтительнее. Первый способ, к сожалению, не очень хорош, потому-то конструктор URI объявлен так public URI(String str) throws URISyntaxException, а URISyntaxException — это checked-исключение.

Методы GET(), POST(), PUT(), DELETE()

Задать http-метод запроса можно с помощью методов:

  • GET()
  • POST()
  • PUT()
  • DELETE()

Вот как будет выглядеть простой GET-запрос:


HttpRequest request = HttpRequest.newBuilder()
  .uri(new URI("https://javarush.com"))
  .GET()
  .build();

Метод version()

Также можно задать версию HTTP-протокола. Их всего 2 варианта:

  • HttpClient.Version.HTTP_1_1
  • HttpClient.Version.HTTP_2

Допустим, ты хочешь создать запрос по протоколу HTTP/2, тогда тебе нужно будет написать:


HttpRequest request = HttpRequest.newBuilder()
   .uri(new URI("https://javarush.com"))
   .version( HttpClient.Version.HTTP_2 )
   .GET()
   .build();

Очень просто, не правда ли? :)

Метод timeout()

Также можно задать время выполнения запроса. Если оно пройдет, а запрос так и не будет выполнен, то выкинется исключение HttpTimeoutException.

Само время задается с помощью объекта Duration из Java DateTime API. Пример:


HttpRequest request = HttpRequest.newBuilder()
   .uri(new URI("https://javarush.com"))
   .timeout( Duration.of(5, SECONDS) )
   .GET()
   .build();

Наличие этого метода показывает, что классы HttpClient и HttpRequest могут решать самые разнообразные задачи. Представь, что ты выполняешь запрос, а что-то случилось с сетью и он продлился 30 секунд. Куда полезнее сразу получить исключение и правильно на него среагировать.

Метод header()

Также к любому запросу можно добавить сколько угодно заголовков. И сделать это так же просто, как и все остальное. Для этого есть специальный метод — header(). Пример:


HttpRequest request = HttpRequest.newBuilder()
   .uri(new URI("https://javarush.com"))
   .header("name1", "value1")
   .header("name2", "value2")
   .GET()
   .build();

Есть еще один альтернативный способ задать сразу много заголовков. Может пригодиться, если, ты, допустим, преобразовал список заголовков в массив:


HttpRequest request = HttpRequest.newBuilder()
   .uri(new URI("https://javarush.com"))
   .headers("name1", "value1", "name2", "value2")
   .GET()
   .build();

Все элементарное просто.