← Назад к вопросам

Какие знаешь инструменты для асинхронного взаимодействия с протоколом HTTPs?

2.0 Middle🔥 151 комментариев
#REST API и микросервисы

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Инструменты для асинхронного взаимодействия с HTTPS в Java

Асинхронное HTTP взаимодействие — это способ отправления HTTP запросов без блокирования текущего потока. Java предоставляет множество инструментов и библиотек для работы с HTTPS асинхронно, каждая из которых имеет свои особенности и применение.

1. Java 11+ HttpClient (встроенный в JDK)

HttpClient — встроенный HTTP клиент в Java 11+, поддерживает асинхронные запросы с CompletableFuture.

import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;
import java.util.concurrent.CompletableFuture;

public class HttpClientExample {
    public static void main(String[] args) throws Exception {
        HttpClient client = HttpClient.newHttpClient();

        HttpRequest request = HttpRequest.newBuilder()
                .uri(new URI("https://api.example.com/users"))
                .GET()
                .timeout(java.time.Duration.ofSeconds(10))
                .build();

        // Асинхронный запрос
        CompletableFuture<HttpResponse<String>> response = client
                .sendAsync(request, HttpResponse.BodyHandlers.ofString());

        // Обработка результата
        response.thenApply(HttpResponse::body)
                .thenAccept(System.out::println)
                .exceptionally(e -> {
                    System.err.println("Error: " + e.getMessage());
                    return null;
                })
                .join(); // Ожидание завершения
    }
}

// POST запрос
public class HttpClientPostExample {
    public static void main(String[] args) throws Exception {
        HttpClient client = HttpClient.newHttpClient();

        String jsonBody = "{\"name\":\"John\",\"email\":\"john@example.com\"}";

        HttpRequest request = HttpRequest.newBuilder()
                .uri(new URI("https://api.example.com/users"))
                .header("Content-Type", "application/json")
                .POST(HttpRequest.BodyPublishers.ofString(jsonBody))
                .build();

        CompletableFuture<HttpResponse<String>> response = client
                .sendAsync(request, HttpResponse.BodyHandlers.ofString());

        response.thenAccept(r -> {
            System.out.println("Status: " + r.statusCode());
            System.out.println("Body: " + r.body());
        }).join();
    }
}

Характеристики:

  • Встроен в JDK 11+
  • Поддержка HTTP/2
  • CompletableFuture для асинхронности
  • Простой и современный API
  • Не требует дополнительных зависимостей

2. OkHttp (Square)

OkHttp — мощный HTTP клиент с поддержкой асинхронных запросов и кеширования.

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Response;
import okhttp3.MediaType;
import okhttp3.RequestBody;
import java.io.IOException;

public class OkHttpExample {
    public static void main(String[] args) {
        OkHttpClient client = new OkHttpClient();

        // Асинхронный GET запрос
        Request request = new Request.Builder()
                .url("https://api.example.com/users")
                .build();

        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                System.err.println("Error: " + e.getMessage());
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                if (response.isSuccessful()) {
                    System.out.println("Response: " + response.body().string());
                } else {
                    System.out.println("Error: " + response.code());
                }
            }
        });

        // Дождаться завершения запроса
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
    }
}

// POST запрос с JSON
public class OkHttpPostExample {
    public static void main(String[] args) {
        OkHttpClient client = new OkHttpClient();

        String jsonBody = "{\"name\":\"John\",\"email\":\"john@example.com\"}";

        RequestBody body = RequestBody.create(
                jsonBody,
                MediaType.get("application/json; charset=utf-8")
        );

        Request request = new Request.Builder()
                .url("https://api.example.com/users")
                .post(body)
                .build();

        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                e.printStackTrace();
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                System.out.println("Status: " + response.code());
                System.out.println("Body: " + response.body().string());
            }
        });
    }
}

Характеристики:

  • Асинхронные запросы через Callback
  • Встроенное кеширование
  • Автоматический retry и fallback
  • Поддержка HTTPS
  • Очень популярен в Android разработке

3. AsyncHttpClient (AHC)

AsyncHttpClient — специализированный асинхронный HTTP клиент с поддержкой WebSocket.

import org.asynchttpclient.AsyncHttpClient;
import org.asynchttpclient.DefaultAsyncHttpClient;
import org.asynchttpclient.ListenableFuture;
import java.util.concurrent.CompletableFuture;

public class AsyncHttpClientExample {
    public static void main(String[] args) throws Exception {
        AsyncHttpClient client = new DefaultAsyncHttpClient();

        try {
            // Асинхронный GET запрос
            ListenableFuture<Response> future = client
                    .prepareGet("https://api.example.com/users")
                    .execute();

            future.toCompletableFuture()
                    .thenAccept(response -> {
                        System.out.println("Status: " + response.getStatusCode());
                        System.out.println("Body: " + response.getResponseBody());
                    })
                    .exceptionally(e -> {
                        System.err.println("Error: " + e.getMessage());
                        return null;
                    })
                    .join();
        } finally {
            client.close();
        }
    }
}

Характеристики:

  • Полностью асинхронный
  • Поддержка WebSocket
  • Работает с Netty
  • CompletableFuture для удобства

4. WebClient (Spring WebFlux)

WebClient — современный HTTP клиент в Spring 5+, предназначен для реактивного программирования.

import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;
import reactor.core.publisher.Flux;

public class WebClientExample {
    private final WebClient webClient;

    public WebClientExample(WebClient webClient) {
        this.webClient = webClient;
    }

    // GET запрос (Mono возвращает один результат)
    public void getUser(String userId) {
        webClient.get()
                .uri("/users/{id}", userId)
                .retrieve()
                .bodyToMono(String.class)
                .subscribe(
                        body -> System.out.println("Response: " + body),
                        error -> System.err.println("Error: " + error.getMessage())
                );
    }

    // POST запрос
    public void createUser(String name, String email) {
        webClient.post()
                .uri("/users")
                .bodyValue(new UserRequest(name, email))
                .retrieve()
                .bodyToMono(UserResponse.class)
                .subscribe(
                        response -> System.out.println("Created: " + response.getId()),
                        error -> System.err.println("Error: " + error.getMessage())
                );
    }

    // Получение списка (Flux возвращает много результатов)
    public void getAllUsers() {
        webClient.get()
                .uri("/users")
                .retrieve()
                .bodyToFlux(User.class)
                .subscribe(
                        user -> System.out.println("User: " + user.getName()),
                        error -> System.err.println("Error: " + error.getMessage()),
                        () -> System.out.println("Completed")
                );
    }

    static class UserRequest {
        private String name;
        private String email;

        public UserRequest(String name, String email) {
            this.name = name;
            this.email = email;
        }
    }

    static class UserResponse {
        private Long id;

        public Long getId() {
            return id;
        }
    }

    static class User {
        private String name;

        public String getName() {
            return name;
        }
    }
}

Характеристики:

  • Реактивный (Mono/Flux из Project Reactor)
  • Интеграция с Spring
  • Non-blocking I/O
  • Поддержка обработки потоков данных

5. Retrofit (Square)

Retrofit — декларативный HTTP клиент для отправки асинхронных запросов через интерфейсы.

import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.Body;
import retrofit2.http.Path;

public interface UserApi {
    @GET("/users/{id}")
    Call<User> getUser(@Path("id") String userId);

    @POST("/users")
    Call<UserResponse> createUser(@Body User user);
}

public class RetrofitExample {
    public static void main(String[] args) {
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("https://api.example.com/")
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        UserApi api = retrofit.create(UserApi.class);

        // Асинхронный запрос
        api.getUser("123").enqueue(new Callback<User>() {
            @Override
            public void onResponse(Call<User> call, Response<User> response) {
                if (response.isSuccessful()) {
                    System.out.println("User: " + response.body().getName());
                }
            }

            @Override
            public void onFailure(Call<User> call, Throwable t) {
                System.err.println("Error: " + t.getMessage());
            }
        });
    }

    static class User {
        private String name;

        public String getName() {
            return name;
        }
    }

    static class UserResponse {
        private Long id;
    }
}

Характеристики:

  • Декларативный API через интерфейсы
  • Использует OkHttp под капотом
  • Встроенная сериализация (JSON, XML)
  • RxJava интеграция

6. Reactor (Project Reactor)

Reactor — реактивная библиотека для асинхронного программирования с Mono и Flux.

import reactor.core.publisher.Mono;
import reactor.core.publisher.Flux;

public class ReactorExample {
    public static void main(String[] args) {
        // Mono — 0 или 1 элемент
        Mono.fromCallable(() -> {
            System.out.println("Fetching user...");
            return fetchUser("123");
        })
        .subscribe(
            user -> System.out.println("User: " + user),
            error -> System.err.println("Error: " + error.getMessage())
        );

        // Flux — 0, 1 или много элементов
        Flux.fromIterable(fetchUsers())
            .filter(user -> user.getAge() > 18)
            .map(User::getName)
            .subscribe(
                name -> System.out.println("Name: " + name),
                error -> System.err.println("Error: " + error.getMessage()),
                () -> System.out.println("Completed")
            );
    }

    static String fetchUser(String id) {
        return "User " + id;
    }

    static java.util.List<User> fetchUsers() {
        return java.util.Arrays.asList(
            new User("John", 30),
            new User("Jane", 25),
            new User("Bob", 17)
        );
    }

    static class User {
        private String name;
        private int age;

        User(String name, int age) {
            this.name = name;
            this.age = age;
        }

        String getName() { return name; }
        int getAge() { return age; }
    }
}

7. Vert.x

Vert.x — асинхронный и не-блокирующий фреймворк для построения реактивных приложений.

import io.vertx.core.Vertx;
import io.vertx.ext.web.client.WebClient;
import io.vertx.ext.web.client.HttpResponse;
import io.vertx.core.buffer.Buffer;

public class VertxExample {
    public static void main(String[] args) {
        Vertx vertx = Vertx.vertx();
        WebClient client = WebClient.create(vertx);

        // Асинхронный GET запрос
        client.getAbs("https://api.example.com/users")
            .send(ar -> {
                if (ar.succeeded()) {
                    HttpResponse<Buffer> response = ar.result();
                    System.out.println("Status: " + response.statusCode());
                    System.out.println("Body: " + response.bodyAsString());
                } else {
                    System.err.println("Error: " + ar.cause().getMessage());
                }
            });
    }
}

Таблица сравнения инструментов

ИнструментВстроенCallbackCompletableFutureReactiveПопулярность
HttpClientДа (Java 11+)НетДаНетВысокая
OkHttpНетДаНетНетОчень высокая
AsyncHttpClientНетНетДаНетСредняя
WebClientНет (Spring)НетНетДа (Reactor)Очень высокая
RetrofitНетДаНетОпция (RxJava)Очень высокая
ReactorНетНетНетДаВысокая
Vert.xНетДаНетДаСредняя

Рекомендации

  • HttpClient — для Java 11+ без дополнительных зависимостей
  • OkHttp — универсальный выбор, простой и надёжный
  • WebClient — если вы используете Spring
  • Retrofit — для REST API с декларативным стилем
  • Reactor — для реактивного программирования в Spring
  • Vert.x — для высоконагруженных приложений

Выбор инструмента зависит от ваших требований: простоты, производительности, интеграции с фреймворком и предпочтения парадигмы программирования (callback, future, reactive).

Какие знаешь инструменты для асинхронного взаимодействия с протоколом HTTPs? | PrepBro