Kotlin Academy · Oppitunti

Sisällön neuvottelu ja kotlinx.serialization

Määrittäkää JSON-serialisointi ja purkakaa pyyntöjen rungot automaattisesti.

Oppitunti 3/413 vaihetta

Sisällön neuvottelu ja kotlinx.serialization on ilmainen Kotlin Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Kotlin Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Kotlin Academy-kurssilla on yhteensä 4 oppituntia.

Mitä sisältöneuvottelu on

Sisältöneuvottelu on HTTP-mekanismi, jolla asiakas ja palvelin sopivat vastausrungon muodosta. Asiakas lähettää Accept-otsakkeen, ja palvelin valitsee parhaiten sopivan muodon. Ktorin ContentNegotiation-laajennus automatisoi tämän.

Riippuvuuksien lisääminen

Lisää ContentNegotiation-laajennus ja kotlinx.serialization-kirjaston JSON-muunnin:

dependencies {
    implementation("io.ktor:ktor-server-content-negotiation:2.3.12")
    implementation("io.ktor:ktor-serialization-kotlinx-json:2.3.12")
    implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.1")
}

ContentNegotiation-laajennuksen asentaminen

Asenna laajennus Application-moduulissa ja rekisteröi JSON-muunnin:

import io.ktor.server.plugins.contentnegotiation.*
import io.ktor.serialization.kotlinx.json.*

fun Application.configureSerialization() {
    install(ContentNegotiation) {
        json()
    }
}

@Serializable-tietoluokat

Merkitse tietoluokkasi kotlinx.serialization-kirjaston @Serializable-annotaatiolla. Kotlin-kääntäjän laajennus luo serialisoijan käännösaikana, joten ajonaikaista reflektiota ei tarvita:

import kotlinx.serialization.Serializable

@Serializable
data class User(val id: Long, val name: String, val email: String)

Vastaaminen serialisoitavalla oliolla

Kun ContentNegotiation-laajennus on asennettu, välitä mikä tahansa @Serializable-olio kutsulle call.respond(). Ktor serialisoi sen automaattisesti JSON-muotoon:

get("/users/{id}") {
    val user = User(1L, "Alice", "alice@example.com")
    call.respond(user)  // serialized to JSON
}

Serialisoitavan olion vastaanottaminen

Käytä kutsua call.receive() deserialisoidaksesi pyynnön rungon @Serializable-luokan olioksi. Jos runko on virheellinen, Ktor heittää ContentTransformationException-poikkeuksen:

post("/users") {
    val newUser = call.receive<User>()
    call.respond(HttpStatusCode.Created, newUser)
}

JSON-määrityksen mukauttaminen

Välitä Json-ilmentymä json()-funktiolle serialisoinnin mukauttamiseksi: ohita tuntemattomat avaimet, muotoile tuloste luettavaksi, käytä sallivaa tilaa ja niin edelleen:

install(ContentNegotiation) {
    json(Json {
        prettyPrint = true
        isLenient = true
        ignoreUnknownKeys = true
    })
}

Useat sisältötyypit

Rekisteröi useita muuntimia tukeaksesi eri Accept-tyyppejä. Ktor valitsee ensimmäisen muuntimen, joka vastaa asiakkaan Accept-otsaketta:

install(ContentNegotiation) {
    json()
    // xml() with ktor-serialization-kotlinx-xml if needed
}

Listojen ja map-rakenteiden serialisointi

Kääri kokoelmat vastausolioon tai käytä suoraan kutsua call.respond(list). kotlinx.serialization käsittelee tyyppejä List, Map ja sisäkkäisiä geneerisiä tyyppejä, kunhan alkiotyypit ovat @Serializable:

get("/users") {
    val users = listOf(
        User(1, "Alice", "a@example.com"),
        User(2, "Bob", "b@example.com")
    )
    call.respond(users)
}

Mukautetut serialisoijat

Jos kyseessä on tyyppi, jota et omista (esimerkiksi java.time.Instant), toteuta KSerializer ja rekisteröi se joko kutsulla @Serializable(with = MySerializer::class) tai kontekstuaalisella serialisoijamoduulilla:

val module = SerializersModule {
    contextual(Instant::class, InstantSerializer)
}
install(ContentNegotiation) {
    json(Json { serializersModule = module })
}

Deserialisointivirheiden käsittely

Asentakaa StatusPages-laajennus, jotta call.receive()-kutsun epäonnistuessa palautetaan selkeä virhevastaus:

install(StatusPages) {
    exception<ContentTransformationException> { call, _ ->
        call.respond(HttpStatusCode.BadRequest, "Invalid request body")
    }
}

Pikatarkistus

Mikä annotaatio Kotlinin data-luokalle tarvitaan, jotta kotlinx.serialization voi serialisoida sen?

Kertaus: Content Negotiation ja kotlinx.serialization

Tärkeimmät asiat:

  • Asentakaa ContentNegotiation ja json() automaattista JSON-serialisointia ja -deserialisointia varten
  • Lisätkää data-luokkiin annotaatio @Serializable
  • Käyttäkää call.respond(obj)-kutsua serialisointiin ja call.receive()-kutsua deserialisointiin
  • Mukauttakaa toimintaa välittämällä Json { ... } -instanssi funktiolle json()
  • Käsitelkää deserialisointivirheet hallitusti StatusPages-laajennuksen avulla
Aloita maksutta

Opi Kotlin tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
51
Oppitunnit
203

Usein kysytyt kysymykset

Onko oppitunti ”Sisällön neuvottelu ja kotlinx.serialization” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Kotlin Academy-oppimispolun 3 oppituntia, myös oppitunnin “Sisällön neuvottelu ja kotlinx.serialization”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Kotlin Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Sisällön neuvottelu ja kotlinx.serialization”?

Määrittäkää JSON-serialisointi ja purkakaa pyyntöjen rungot automaattisesti. Harjoittelet Kotlin Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Kotlin Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Kotlin Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.

Kuinka kauan ”Sisällön neuvottelu ja kotlinx.serialization”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Kotlin Academy-oppitunnilla?

Kyllä. Jokainen Kotlin Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Ktor-projektin määritys: embeddedServer ja Application-moduulit
  2. Reititys ja tyypitetyt parametrit
  3. Sisällön neuvottelu ja kotlinx.serialization
  4. Todennusliitännäiset: JWT ja istunto
← Takaisin: Kotlin Academy