Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗ktSpHtTmo 258 of 299 menu
◀ ▶

Таймаут запроса в Kotlin

Долгий ответ можно оборвать по времени. У построителя HttpRequest есть timeout с Duration - счетчик идет на весь обмен, включая чтение тела.

Путь "/delay/1" на httpbin.org ждет около секунды перед ответом. Лимит короче этой паузы приводит к исключению:

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 fun main() { val client = HttpClient.newBuilder().build() val request = HttpRequest.newBuilder() .uri(URI.create("https://httpbin.org/delay/1")) .timeout(Duration.ofMillis(300)) .GET() .build() try { client.send( request, HttpResponse.BodyHandlers.ofString(), ) } catch (ex: HttpTimeoutException) { println("timeout") } }

Отдельно задают connectTimeout на HttpClient - он ограничивает только установку соединения. Для медленного ответа после коннекта нужен именно timeout запроса:

import java.net.URI import java.net.http.HttpClient import java.net.http.HttpRequest import java.net.http.HttpResponse import java.time.Duration fun main() { val client = HttpClient.newBuilder() .connectTimeout(Duration.ofSeconds(5)) .build() val request = HttpRequest.newBuilder() .uri(URI.create("https://httpbin.org/delay/1")) .timeout(Duration.ofMillis(400)) .GET() .build() println(request.timeout().get().toMillis()) }

Отправьте чтение на "/delay/1" с лимитом 200 миллисекунд. Выведите "timeout", если сработало исключение по времени.

Выведите "ok", если запрос к "/delay/1" успел завершиться при лимите 3 секунды, и "timeout" при более коротком лимите 100 миллисекунд - две строки подряд.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить