1. Методи 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.com”))
    .build();
HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString());

Всі методи класу HttpRequest ти можеш знайти за цим посиланням, в офіційній документації.

А далі ми розберемо найпопулярніші з них.

2. Метод uri()

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


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

До речі, можна записати цей код ще трохи коротше, якщо передати URI прямо до методу newBuilder() :


HttpRequest request = HttpRequest.newBuilder( URI.create(“http://javarush.com”) ).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();

3. Метод 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();

Дуже просто, чи не так? :)

4. Метод 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 секунд. Набагато корисніше одразу отримати виняток і правильно на нього зреагувати.

5. Метод 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();

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