Таймаут запроса в 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
миллисекунд - две строки подряд.