การเจรจาเนื้อหาและ kotlinx.serialization
กำหนดค่าการทำซีเรียลไลซ์ JSON และดีซีเรียลไลซ์เนื้อหาคำขอโดยอัตโนมัติ
การเจรจาเนื้อหาและ kotlinx.serialization เป็นบทเรียน Kotlin Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Kotlin Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Kotlin Academy มีบทเรียนทั้งหมด 4 บทเรียน
การเจรจาเนื้อหาคืออะไร
การเจรจาเนื้อหาคือกลไกของ HTTP ที่ไคลเอ็นต์และเซิร์ฟเวอร์ใช้ตกลงรูปแบบของเนื้อหาการตอบกลับ ไคลเอ็นต์จะส่งเฮดเดอร์ Accept และเซิร์ฟเวอร์จะเลือกรูปแบบที่ตรงกันมากที่สุด ปลั๊กอิน ContentNegotiation ของ Ktor จะทำงานนี้โดยอัตโนมัติ
การเพิ่มการอ้างอิง
เพิ่มปลั๊กอิน ContentNegotiation และตัวแปลง JSON ของ kotlinx.serialization:
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
ติดตั้งปลั๊กอินในโมดูล Application และลงทะเบียนตัวแปลง JSON:
import io.ktor.server.plugins.contentnegotiation.*
import io.ktor.serialization.kotlinx.json.*
fun Application.configureSerialization() {
install(ContentNegotiation) {
json()
}
}คลาสข้อมูล @Serializable
ใส่คำอธิบายประกอบ @Serializable จาก kotlinx.serialization ให้กับคลาสข้อมูลของคุณ ปลั๊กอินคอมไพเลอร์ Kotlin จะสร้างตัวแปลงอนุกรมขณะคอมไพล์ จึงไม่จำเป็นต้องใช้การสะท้อนขณะทำงาน:
import kotlinx.serialization.Serializable
@Serializable
data class User(val id: Long, val name: String, val email: String)การตอบกลับด้วยออบเจ็กต์ที่ Serializable
เมื่อติดตั้ง ContentNegotiation แล้ว ให้ส่งออบเจ็กต์ @Serializable ใด ๆ ไปยัง call.respond() Ktor จะแปลงออบเจ็กต์นั้นเป็น JSON โดยอัตโนมัติ:
get("/users/{id}") {
val user = User(1L, "Alice", "alice@example.com")
call.respond(user) // serialized to JSON
}การรับออบเจ็กต์ที่ Serializable
ใช้ call.receive เพื่อแปลงเนื้อหาคำขอเป็นคลาส @Serializable หากเนื้อหามีรูปแบบไม่ถูกต้อง Ktor จะส่งข้อผิดพลาด ContentTransformationException:
post("/users") {
val newUser = call.receive<User>()
call.respond(HttpStatusCode.Created, newUser)
}การปรับแต่งการกำหนดค่า JSON
ส่งอินสแตนซ์ Json ไปยัง json() เพื่อปรับแต่งการทำซีเรียลไลซ์ เช่น ละเว้นคีย์ที่ไม่รู้จัก แสดงผลให้อ่านง่าย ใช้โหมดผ่อนปรน เป็นต้น:
install(ContentNegotiation) {
json(Json {
prettyPrint = true
isLenient = true
ignoreUnknownKeys = true
})
}ประเภทเนื้อหาหลายประเภท
ลงทะเบียนตัวแปลงหลายตัวเพื่อรองรับประเภท Accept ที่แตกต่างกัน Ktor จะเลือกตัวแปลงตัวแรกที่ตรงกับเฮดเดอร์ Accept ของไคลเอ็นต์:
install(ContentNegotiation) {
json()
// xml() with ktor-serialization-kotlinx-xml if needed
}การทำซีเรียลไลซ์ลิสต์และแมป
ห่อคอลเลกชันไว้ในออบเจ็กต์การตอบกลับ หรือใช้ call.respond(list) ได้โดยตรง kotlinx.serialization รองรับ List, Map และเจเนอริกที่ซ้อนกัน ตราบใดที่ประเภทของสมาชิกมีคำอธิบายประกอบ @Serializable:
get("/users") {
val users = listOf(
User(1, "Alice", "a@example.com"),
User(2, "Bob", "b@example.com")
)
call.respond(users)
}ตัวแปลงอนุกรมแบบกำหนดเอง
สำหรับประเภทที่คุณไม่ได้เป็นเจ้าของ (เช่น java.time.Instant) ให้ใช้งาน KSerializer และลงทะเบียนผ่าน @Serializable(with = MySerializer::class) หรือโมดูลตัวแปลงอนุกรมแบบบริบท:
val module = SerializersModule {
contextual(Instant::class, InstantSerializer)
}
install(ContentNegotiation) {
json(Json { serializersModule = module })
}การจัดการข้อผิดพลาดจากการแปลงกลับที่ล้มเหลว
ติดตั้งปลั๊กอิน StatusPages เพื่อส่งคืนการตอบกลับข้อผิดพลาดที่เหมาะสมเมื่อ call.receive ทำงานไม่สำเร็จ:
install(StatusPages) {
exception<ContentTransformationException> { call, _ ->
call.respond(HttpStatusCode.BadRequest, "Invalid request body")
}
}ตรวจสอบความเข้าใจ
คลาสข้อมูลของ Kotlin ต้องมีคำอธิบายประกอบใดจึงจะสามารถทำซีเรียลไลซ์ด้วย kotlinx.serialization ได้
ทบทวน: การเจรจาเนื้อหาและ kotlinx.serialization
ประเด็นสำคัญ:
- ติดตั้ง
ContentNegotiation+json()เพื่อทำซีเรียลไลซ์และดีซีเรียลไลซ์ JSON โดยอัตโนมัติ - ใส่คำอธิบายประกอบให้คลาสข้อมูลด้วย
@Serializable - ใช้
call.respond(obj)เพื่อทำซีเรียลไลซ์ และใช้call.receiveเพื่อทำดีซีเรียลไลซ์() - ปรับแต่งได้ด้วยอินสแตนซ์
Json { ... }ที่ส่งให้json() - ใช้
StatusPagesเพื่อจัดการข้อผิดพลาดจากการดีซีเรียลไลซ์อย่างเหมาะสม
เรียนรู้ Kotlin ด้วย AI tutor — ฟรี
เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป
- คอร์ส
- 51
- บทเรียน
- 203
คำถามที่พบบ่อย
บทเรียน “การเจรจาเนื้อหาและ kotlinx.serialization” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การเจรจาเนื้อหาและ kotlinx.serialization” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Kotlin Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Kotlin Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การเจรจาเนื้อหาและ kotlinx.serialization”
กำหนดค่าการทำซีเรียลไลซ์ JSON และดีซีเรียลไลซ์เนื้อหาคำขอโดยอัตโนมัติ คุณปฏิบัติ Kotlin Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Kotlin Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Kotlin Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “การเจรจาเนื้อหาและ kotlinx.serialization” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Kotlin Academy นี้ได้ไหม
ได้ บทเรียน Kotlin Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การตั้งค่าโปรเจกต์ Ktor: embeddedServer และโมดูลแอปพลิเคชัน
- การกำหนดเส้นทางและพารามิเตอร์ที่ระบุชนิด
- การเจรจาเนื้อหาและ kotlinx.serialization
- ปลั๊กอินการยืนยันตัวตน: JWT และ Session