Študijné materiály

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()
}

17.3.1 Typy HTTP chýb

| Výnimka | Popis | | ——- | —– | | ClientRequestException | 4xx chyby (400, 404, 401, …) | | ServerResponseException | 5xx chyby (500, 502, …) | | RedirectResponseException | 3xx presmerovania | | IOException | Sieťové problémy |

17.3.2 Timeout

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.

Úlohy

Úloha 1

Nastav klientovi časový limit požiadavky a odchyť všeobecnú sieťovú chybu.

Úloha 2

Vykonaj požiadavku na neexistujúci endpoint a spracuj chybu 4xx.

Úloha 3

Pridaj HttpRequestRetry s tromi pokusmi pri chybách servera.