Как вы выполняете HTTP-запросы к внешним сервисам в Java?

«Как вы выполняете HTTP-запросы к внешним сервисам в Java?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, выполнял. Выбор инструмента зависит от контекста: стандартный HttpClient (Java 11+), библиотеки вроде OkHttp или абстракции Spring.

1. Стандартный HttpClient (Java 11+):

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
        .uri(URI.create("https://api.example.com/users/1"))
        .header("Accept", "application/json")
        .GET()
        .build();

HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println("Status: " + response.statusCode());
System.out.println("Body: " + response.body());

2. Spring WebClient (реактивный стиль):

WebClient client = WebClient.create("https://api.example.com");
User user = client.get()
        .uri("/users/{id}", 1)
        .retrieve()
        .bodyToMono(User.class)
        .block();

3. POST-запрос с телом (JSON):

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

Важные аспекты:

  • Таймауты: Всегда настраивайте connectTimeout и readTimeout.
  • Обработка ошибок: Проверяйте HTTP-статусы (не только 200), используйте механизмы retry и circuit breaker (например, Resilience4j).
  • Сериализация: Используйте Jackson или Gson для преобразования объектов в JSON и обратно.