Študijné materiály

Ktor je HTTP klient a server framework pre Kotlin. Najprv si ukážeme použitie Ktor Client na odosielanie HTTP požiadaviek.

17.1.1 Nastavenie

V build.gradle.kts pridáme potrebné závislosti:

plugins {
    kotlin("jvm") version "2.0.21"
    kotlin("plugin.serialization") version "2.0.21"
}

dependencies {
    implementation("io.ktor:ktor-client-core:3.0.3")
    implementation("io.ktor:ktor-client-cio:3.0.3")
    implementation("io.ktor:ktor-client-content-negotiation:3.0.3")
    implementation("io.ktor:ktor-serialization-kotlinx-json:3.0.3")
    implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3")
    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0")
}

17.1.2 Základný GET request

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.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, val email: String)

fun main() = runBlocking {
    val client = HttpClient(CIO) {
        install(ContentNegotiation) {
            json()
        }
    }

    val response = client.get("https://jsonplaceholder.typicode.com/users/1")
    val user = response.body<User>()
    println(user)

    client.close()
}

17.1.3 POST request

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.request.*
import io.ktor.http.*
import io.ktor.serialization.kotlinx.json.*
import kotlinx.serialization.Serializable
import kotlinx.coroutines.runBlocking

@Serializable
data class Post(val userId: Int, val id: Int?, val title: String, val body: String)

fun main() = runBlocking {
    val client = HttpClient(CIO) {
        install(ContentNegotiation) { json() }
    }

    val newPost = Post(userId = 1, id = null, title = "Novy prispevok", body = "Obsah prispevku")
    val response = client.post("https://jsonplaceholder.typicode.com/posts") {
        contentType(ContentType.Application.Json)
        setBody(newPost)
    }
    val createdPost = response.body<Post>()
    println(createdPost)

    client.close()
}

runBlocking je špeciálna funkcia, ktorá spustí coroutine a blokuje hlavné vlákno kým neskončí.

Úlohy

Úloha 1

Nastav Ktor klient s CIO a vykonaj GET požiadavku na verejné testovacie API.

Úloha 2

Vytvor @Serializable triedu pre odpoveď a vypíš z nej vybrané pole.

Úloha 3

Odošli POST požiadavku s JSON telom a vypíš odpoveď servera.