Как отправить HTTP-запрос
Короткий ответ
Встроенный HttpClient (Java 11) отправляет запросы без сторонних библиотек. Пример обращается к сети, поэтому результат зависит от сервера:
void main() throws Exception {
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder(URI.create("https://example.com/")).GET().build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
IO.println(response.statusCode());
IO.println(response.body().length());
}Программа выведет код ответа (например, 200) и длину полученной страницы.
POST с JSON
Тело запроса передаётся через BodyPublishers, заголовки — через header():
void main() throws Exception {
String json = """
{"name": "Anna", "email": "anna@site.com"}
""";
HttpRequest request = HttpRequest.newBuilder(URI.create("https://api.example.com/users"))
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(json))
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
IO.println(response.statusCode());
}Тайм-ауты
Задайте тайм-аут соединения у клиента и тайм-аут ответа у запроса:
void main() throws Exception {
HttpClient client = HttpClient.newBuilder().connectTimeout(Duration.ofSeconds(5)).build();
HttpRequest request = HttpRequest.newBuilder(URI.create("https://example.com/"))
.timeout(Duration.ofSeconds(10))
.build();
try {
IO.println(client.send(request, HttpResponse.BodyHandlers.ofString()).statusCode());
} catch (HttpTimeoutException e) {
IO.println("Server did not answer in time");
}
}Частая ошибка
Считать, что ответ 404 или 500 — это исключение. HttpClient выбрасывает исключение только при сетевых ошибках, а коды ошибок сервера приходят как обычный ответ. Всегда проверяйте response.statusCode(). Ответ в JSON разбирайте библиотекой — Jackson или Gson.
Функции из этого ответа
- Text block """ — Многострочный строковый литерал в тройных кавычках.