Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Справочник Java

HttpClient

Встроенный HTTP-клиент: отправляет запросы синхронно (send) или асинхронно (sendAsync).

Доступно с: Java 11

Синтаксис

public abstract class HttpClient implements AutoCloseable

Примеры

GET-запрос. Чтобы пример работал без интернета, в начале запускается маленький локальный сервер; в реальном коде вместо uri подставьте адрес вида https://...:

import com.sun.net.httpserver.HttpServer;
import java.net.InetSocketAddress;
import java.net.URI;
import java.net.http.*;
 
void main() throws Exception {
    // a tiny local server so the example runs offline
    HttpServer server = HttpServer.create(new InetSocketAddress("localhost", 0), 0);
    server.createContext("/hello", exchange -> {
        byte[] body = "Hello from server".getBytes();
        exchange.sendResponseHeaders(200, body.length);
        exchange.getResponseBody().write(body);
        exchange.close();
    });
    server.start();
    URI uri = URI.create("http://localhost:" + server.getAddress().getPort() + "/hello");
 
    try (HttpClient client = HttpClient.newHttpClient()) {
        HttpRequest request = HttpRequest.newBuilder(uri).build();
        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
        IO.println(response.statusCode());
        IO.println(response.body());
    }
    server.stop(0);
}

Результат:

200
Hello from server

Настройка клиента через newBuilder() и асинхронный запрос: sendAsync() сразу возвращает CompletableFuture:

import com.sun.net.httpserver.HttpServer;
import java.net.InetSocketAddress;
import java.net.URI;
import java.net.http.*;
 
void main() throws Exception {
    HttpServer server = HttpServer.create(new InetSocketAddress("localhost", 0), 0);
    server.createContext("/time", exchange -> {
        byte[] body = "12:00".getBytes();
        exchange.sendResponseHeaders(200, body.length);
        exchange.getResponseBody().write(body);
        exchange.close();
    });
    server.start();
    URI uri = URI.create("http://localhost:" + server.getAddress().getPort() + "/time");
 
    try (HttpClient client = HttpClient.newBuilder()
            .connectTimeout(Duration.ofSeconds(5))
            .followRedirects(HttpClient.Redirect.NORMAL)
            .build()) {
        CompletableFuture<String> body = client
            .sendAsync(HttpRequest.newBuilder(uri).build(), HttpResponse.BodyHandlers.ofString())
            .thenApply(HttpResponse::body);
        IO.println("Request sent");
        IO.println("Server time: " + body.join());
    }
    server.stop(0);
}

Результат:

Request sent
Server time: 12:00

Примечания

Клиент находится в модуле java.net.http, поэтому в компактном файле нужен import java.net.http.*;. Создайте один клиент и используйте его для всех запросов: он потокобезопасен и держит пул соединений. С Java 21 клиент можно закрыть через try с ресурсами. send() бросает IOException (нет связи) и InterruptedException; ответ 404 или 500 исключением не считается — проверяйте statusCode(). Встроенный сервер com.sun.net.httpserver.HttpServer подходит для примеров и тестов.

См. также

  • HttpRequest — Неизменяемый HTTP-запрос: адрес, метод, заголовки и тело. Создаётся через newBuilder().
  • HttpResponse — Ответ сервера: код статуса, заголовки и тело того типа, который задал BodyHandler.
  • CompletableFuture.thenApply() — Добавляет шаг, который преобразует результат, когда тот будет готов.
  • try-with-resources — Блок `try`, который сам закрывает открытые ресурсы — файлы, соединения, потоки.

В учебнике

  • HTTP-клиент — Запросы к веб-серверам из Java — HttpClient, HttpRequest и HttpResponse.BodyHandlers, GET и POST с JSON, коды ответа и асинхронный sendAsync.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.