Метод timeout
Метод timeout класса HttpRequest задает
максимальное время, в течение которого клиент
будет ожидать ответ от сервера. Если ответ не
будет получен за указанный промежуток времени,
будет выброшено исключение HttpTimeoutException.
В первый параметр мы передаем длительность
таймаута, во второй - единицу измерения времени
(например, TimeUnit.SECONDS или
TimeUnit.MILLISECONDS).
Метод вызывается у объекта HttpRequest.Builder
до вызова метода build. Если таймаут не задан,
запрос может ожидать ответа бесконечно долго.
Синтаксис
builder.timeout(duration, unit)
Пример
Давайте создадим GET-запрос с таймаутом в
5 секунд и выполним его:
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
public class Main
{
public static void main(String[] args) throws Exception
{
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://example.com"))
.timeout(Duration.ofSeconds(5))
.GET()
.build();
HttpResponse<String> res = client.send(
request,
HttpResponse.BodyHandlers.ofString()
);
System.out.println(res.statusCode());
}
}
Результат выполнения кода:
200
Пример
Давайте зададим таймаут в 500 миллисекунд,
чтобы запрос завершался как можно быстрее:
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
import java.util.concurrent.TimeUnit;
public class Main
{
public static void main(String[] args) throws Exception
{
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://example.com"))
.timeout(Duration.ofMillis(500))
.GET()
.build();
HttpResponse<String> res = client.send(
request,
HttpResponse.BodyHandlers.ofString()
);
System.out.println(res.statusCode());
}
}
Результат выполнения кода:
200
Пример
Давайте посмотрим, что произойдет, если сервер не успеет ответить за отведенное время:
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.http.HttpTimeoutException;
import java.time.Duration;
public class Main
{
public static void main(String[] args) throws Exception
{
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://example.com"))
.timeout(Duration.ofMillis(1))
.GET()
.build();
try {
HttpResponse<String> res = client.send(
request,
HttpResponse.BodyHandlers.ofString()
);
System.out.println(res.statusCode());
} catch (HttpTimeoutException e) {
System.out.println("Request timed out");
}
}
}
Результат выполнения кода:
"Request timed out"
Смотрите также
-
класс
HttpRequest,
который представляет HTTP-запрос -
метод
newBuilder,
который создает построитель запроса -
метод
send,
который синхронно отправляет запрос -
метод
sendAsync,
который асинхронно отправляет запрос