Pri práci s HTTP požiadavkami sa môžu vyskytnúť rôzne chyby - sieťové problémy, zlé odpovede, atď. Preto by sme mali vždy odchytávať výnimky:
import io.ktor.client.*
import io.ktor.client.call.*
import io.ktor.client.engine.cio.*
import io.ktor.client.plugins.contentnegotiation.*
import io.ktor.client.plugins.*
import io.ktor.client.request.*
import io.ktor.serialization.kotlinx.json.*
import kotlinx.serialization.Serializable
import kotlinx.coroutines.runBlocking
@Serializable
data class User(val id: Int, val name: String)
fun main() = runBlocking {
val client = HttpClient(CIO) {
install(ContentNegotiation) { json() }
install(HttpRequestRetry) {
maxRetries = 3
retryOnServerErrors(3)
}
}
try {
val user = client.get("https://jsonplaceholder.typicode.com/users/1")
.body<User>()
println(user)
} catch (e: ClientRequestException) {
println("Chybny request: ${e.response.status}")
} catch (e: RedirectResponseException) {
println("Presmerovanie: ${e.response.status}")
} catch (e: ServerResponseException) {
println("Chyba servera: ${e.response.status}")
} catch (e: Exception) {
println("Neocekavana chyba: ${e.message}")
}
client.close()
}
| Výnimka | Popis |
| ——- | —– |
| ClientRequestException | 4xx chyby (400, 404, 401, …) |
| ServerResponseException | 5xx chyby (500, 502, …) |
| RedirectResponseException | 3xx presmerovania |
| IOException | Sieťové problémy |
Môžeme nastaviť časový limit pre požiadavky:
import io.ktor.client.plugins.*
val client = HttpClient(CIO) {
install(HttpTimeout) {
requestTimeoutMillis = 5000
connectTimeoutMillis = 3000
}
}
Vždy ošetruj chyby - nikdy nespoliehaj na to, že server odpovie správne.
Nastav klientovi časový limit požiadavky a odchyť všeobecnú sieťovú chybu.
Vykonaj požiadavku na neexistujúci endpoint a spracuj chybu 4xx.
Pridaj HttpRequestRetry s tromi pokusmi pri chybách servera.