Ktor: มันคืออะไร, คุณสมบัติของ HTTP แบบอะซิงโครนัส

ผู้แต่ง: IT Sectr เผยแพร่เมื่อ: 2026-03-07 เวลาอ่าน: 8 นาที

Ktor คือ HTTP แบบอะซิงโครนัสสำหรับ Kotlin พัฒนาโดย JetBrains ซึ่งเป็นส่วนหนึ่งของเฟรมเวิร์กชื่อเดียวกันสำหรับการพัฒนาเซิร์ฟเวอร์และไคลเอ็นต์ Ktor สร้างขึ้นบนคอรูนีนของ Kotlin และรองรับหลายแพลตฟอร์ม ตามข้อมูลจาก JetBrains, 2025 Ktor มอบการทำงานร่วมกันแบบเนทีฟกับระบบนิเวศของ Kotlin โดยไม่ต้องรีเฟลกชันและไม่มี dependencies เพิ่มเติม

ประเด็นสำคัญ

  • Ktor — HTTP คลายนต์แบบอะซิงโครนัสใน Kotlin รองรับหลายแพลตฟอร์ม
  • คอรูนีน — พื้นฐานสำหรับการดำเนินการตามคำขอโดยไม่ต้องใช้ callback และสตรีมแบบรีแอกทีฟ
  • ปลั๊กอิน — ระบบขยายแบบโมดูลาร์สำหรับการซีเรียลไลซ์ การบันทึก และการอนุญาต
  • หลายแพลตฟอร์ม — โค้ดเดียวสำหรับ Android, iOS, Desktop และ Server
  • Kotlinx Serialization — การซีเรียลไลซ์แบบเนทีฟโดยไม่ต้องรีเฟลกชันผ่าน @Serializable

Ktor คืออะไร?

Ktor คือเฟรมเวิร์กสำหรับสร้างแอปพลิเคชันเซิร์ฟเวอร์และไคลเอ็นต์แบบอะซิงโครนัสใน Kotlin สร้างโดย JetBrains Ktor Client คือส่วนของไคลเอ็นต์ของเฟรมเวิร์ก ซึ่งให้ HTTP ไคลเอ็นต์ที่รองรับคอรูนีนของ Kotlin อย่างเต็มที่ รองรับหลายแพลตฟอร์ม (JVM, Native, JS) และสถาปัตยกรรมแบบโมดูลาร์ที่ใช้ปลั๊กอิน

Ktor เกิดขึ้นในปี 2018 เพื่อเป็นทางเลือกแทน Retrofit และ OkHttp สำหรับโปรเจกต์ที่ใช้ Kotlin เป็นหลัก แตกต่างจาก Retrofit ที่นำแนวทางของ Java มาใช้กับคำอธิบายประกอบ Ktor Client ใช้ Kotlin DSL สำหรับการกำหนดค่าคำขอ โดยไม่ต้องมีคำอธิบายประกอบและการรีเฟลกชัน ทำให้โค้ดอ่านง่ายและปลอดภัยด้านชนิดสำหรับนักพัฒนา Kotlin

จากการสำรวจ Kotlin Multiplatform ปี 2024 พบว่า Ktor Client ถูกใช้ใน 35% ของโปรเจกต์ Kotlin Multiplatform Mobile (KMM) ทำให้เป็น HTTP ไคลเอ็นต์ที่ได้รับความนิยมเป็นอันดับสองรองจาก OkHttp ในชุมชน Kotlin Ktor ได้รับความนิยมในโปรเจกต์ที่ต้องการการรองรับหลายแพลตฟอร์มและการทำงานร่วมกันแบบเนทีฟกับระบบนิเวศของ Kotlin

Ktor Client ทำงานอย่างไร

สถาปัตยกรรมของ Ktor Client ใช้ไปป์ไลน์ของปลั๊กอิน แต่ละคำขอจะผ่านลำดับของปลั๊กอินที่ติดตั้งไว้ซึ่งสามารถปรับเปลี่ยนคำขอ การตอบสนอง หรือดำเนินการอื่น ๆ เช่น การบันทึก การบีบอัด การซีเรียลไลซ์ การตรวจสอบสิทธิ์

เมื่อสร้าง HTTP ไคลเอ็นต์ผ่านบล็อก HttpClient { } DSL คุณระบุเอ็นจิ้น (OkHttp, Android, CIO, Darwin) และติดตั้งปลั๊กอิน แต่ละเอ็นจิ้นจะดำเนินการส่งคำขอระดับต่ำสำหรับแพลตฟอร์มเฉพาะ: บน Android ใช้เอ็นจิ้น OkHttp, บน iOS — Darwin (URLSession), บน Desktop — CIO (Coroutine I/O) HttpClient จะเลือกเอ็นจิ้นที่เหมาะสมที่สุดสำหรับแพลตฟอร์มปัจจุบันโดยอัตโนมัติ

คำขอใน Ktor Client ถูกดำเนินการผ่านฟังก์ชัน suspend ซึ่งหมายถึงการทำงานร่วมกันอย่างสมบูรณ์กับคอรูนีน ไม่มี Callback, ไม่มี RxJava หรือ LiveData — มีเพียงโค้ดตามลำดับกับ suspend ที่ทำงานแบบอะซิงโครนัสโดยไม่บล็อกเธรด

ไปป์ไลน์การประมวลผลคำขอ

ไปป์ไลน์ของ Ktor ประกอบด้วยระยะ: ขั้นแรกคำขอจะผ่านปลั๊กอินที่ติดตั้งไว้ (เช่น ContentNegotiation สำหรับ JSON, Logging สำหรับบันทึก) จากนั้นเอ็นจิ้นจะดำเนินการตามคำขอ HTTP และการตอบสนองจะผ่านปลั๊กอินอีกครั้งสำหรับการดีซีเรียลไลซ์ ปลั๊กอินแต่ละตัวเป็นฟังก์ชัน suspend ที่ทำงานในคอรูนีนของไปป์ไลน์

ข้อได้เปรียบที่สำคัญของไปป์ไลน์ของ Ktor คือความสามารถในการ ประมวลผลแบบมีเงื่อนไข ปลั๊กอินสามารถตรวจสอบ URL หรือส่วนหัวของคำขอและข้ามการประมวลผลหากไม่ตรงตามเงื่อนไข ตัวอย่างเช่น ContentEncoding กับ gzip จะใช้เฉพาะกับการตอบสนองที่มีส่วนหัว Content-Encoding: gzip และ Auth จะทำงานเฉพาะสำหรับจุดสิ้นสุดที่ได้รับการป้องกันเท่านั้น โดยไม่ส่งผลกระทบต่อ API สาธารณะ

วิธีการแบบไปป์ไลน์นี้ช่วยให้คุณ รวมปลั๊กอิน ได้อย่างยืดหยุ่น: คุณสามารถติดตั้ง ContentNegotiation กับ JSON เพิ่ม Auth กับโทเค็น Bearer เปิดใช้งานการบีบอัด ContentEncoding และ HttpTimeout — และทั้งหมดจะทำงานร่วมกันในลำดับที่ถูกต้อง ลำดับการติดตั้งปลั๊กอินมีความสำคัญ: ปลั๊กอินที่ติดตั้งตัวแรกจะประมวลผลคำขอเร็วกว่าตัวอื่น

ปลั๊กอินของ Ktor Client

ปลั๊กอิน คือระบบขยายแบบโมดูลาร์ของ Ktor ที่แทนที่คำอธิบายประกอบของ Retrofit และอินเตอร์เซปเตอร์ของ OkHttp ปลั๊กอินแต่ละตัวแก้ปัญหางานเฉพาะและติดตั้งผ่านฟังก์ชัน install() ในบล็อก HttpClient Ktor มีปลั๊กอินในตัวและยังอนุญาตให้สร้างปลั๊กอินที่กำหนดเองได้

ปลั๊กอินวัตถุประสงค์
ContentNegotiationการซีเรียลไลซ์และดีซีเรียลไลซ์ JSON, XML ผ่าน Kotlinx Serialization
Loggingการบันทึกคำขอและการตอบสนองพร้อมระดับที่กำหนดค่าได้
Authการตรวจสอบสิทธิ์: Basic, Bearer, Digest พร้อมรีเฟรชโทเค็นอัตโนมัติ
HttpTimeoutการกำหนดค่ากำหนดเวลาการเชื่อมต่อ การอ่าน และคำขอ
ContentEncodingการบีบอัด gzip และ deflate แบบโปร่งใส
DefaultRequestการตั้งค่าเริ่มต้นสำหรับคำขอทั้งหมด

ปลั๊กอินที่กำหนดเอง

สำหรับงานเฉพาะ จะสร้าง ปลั๊กอิน ที่กำหนดเองผ่าน createClientPlugin ปลั๊กอินสามารถสกัดกั้นคำขอ (onRequest) การตอบสนอง (onResponse) หรือจัดการข้อผิดพลาด (onError) ซึ่งแทนที่ Interceptor ของ OkHttp ได้อย่างสมบูรณ์ แต่มี API ของ Kotlin ที่มีการกำหนดชนิดและการสนับสนุนฟังก์ชัน suspend

ปลั๊กอินที่กำหนดเองสะดวกสำหรับการเพิ่มเมตริก ตรรกะลองใหม่อัตโนมัติ การติดตามคำขอ หรือการทดสอบ A/B ของจุดสิ้นสุด แตกต่างจากอินเตอร์เซปเตอร์ของ OkHttp ปลั๊กอินของ Ktor เขียนด้วย Kotlin และทำงานในบริบทของคอรูนีน ทำให้การจัดการข้อผิดพลาดและกำหนดเวลาง่ายขึ้น

สำหรับการดีบักคำขอ จะใช้ปลั๊กอิน Logging ที่ระดับ ALL, HEADERS หรือ BODY Logging แสดงวิธีการ URL สถานะ ส่วนหัว และเนื้อหาของคำขอและการตอบสนอง แตกต่างจาก HttpLoggingInterceptor ของ OkHttp, Ktor Logging ทำงานแบบอะซิงโครนัสและสามารถกำหนดค่าให้กรองตามระดับบันทึก (ERROR, WARN, INFO, DEBUG) โดยไม่ต้องหยุดแอปพลิเคชันเพื่อเปลี่ยนการกำหนดค่า

ตัวอย่างโค้ด Ktor Client ใน Kotlin

มาดู คำขอ GET พื้นฐาน โดยใช้ Ktor Client กัน สร้าง HttpClient ด้วยปลั๊กอิน ContentNegotiation ที่ติดตั้งสำหรับ JSON คำขอถูกดำเนินการผ่านฟังก์ชัน suspend get() และผลลัพธ์จะถูกดีซีเรียลไลซ์เป็น data class โดยอัตโนมัติ

kotlin
data class User(
    val login: String,
    val id: Int,
    val avatarUrl: String
)

val client = HttpClient {
    install(ContentNegotiation) {
        json(Json {
            ignoreUnknownKeys = true
        })
    }
}

suspend fun getUser(): User {
    return client.get("https://api.github.com/users/octocat").body()
}

สำหรับ คำขอ POST ที่มีเนื้อหา จะใช้ฟังก์ชัน post() กับ contentType() และ body() Ktor จะซีเรียลไลซ์ออบเจ็กต์เป็น JSON โดยอัตโนมัติผ่าน ContentNegotiation ที่ติดตั้งไว้ สไตล์ DSL ทำให้โค้ดเป็นลำดับและอ่านง่าย

kotlin
data class CreateRepo(
    val name: String,
    val description: String,
    val private: Boolean
)

suspend fun createRepo(): Unit {
    val repo = CreateRepo(
        name = "my-project",
        description = "Sample project",
        private = false
    )
    client.post("https://api.github.com/user/repos") {
        contentType(ContentType.Application.Json)
        setBody(repo)
    }
}

การกำหนดค่ากำหนดเวลาและส่วนหัว

HttpTimeout และ DefaultRequest เป็นปลั๊กอินหลักสองตัวสำหรับการกำหนดค่า HttpTimeout ตั้งค่าขีดจำกัดเวลา และ DefaultRequest ระบุส่วนหัวและพารามิเตอร์ URL สำหรับคำขอทั้งหมด เพื่อลดการทำซ้ำโค้ดในการเรียกแต่ละครั้ง

kotlin
val client = HttpClient {
    install(HttpTimeout) {
        connectTimeoutMillis = 15000
        requestTimeoutMillis = 30000
    }
    install(DefaultRequest) {
        url("https://api.github.com/")
        header("Accept", "application/json")
    }
}

การรองรับหลายแพลตฟอร์มของ Ktor

หลายแพลตฟอร์ม คือข้อได้เปรียบหลักของ Ktor เหนือ OkHttp และ Retrofit Ktor Client ทำงานบน JVM (Android, Server), Native (iOS, macOS, Windows, Linux) และ JS (Browser) โค้ด HTTP ไคลเอ็นต์เดียวกันทำงานบนทุกแพลตฟอร์มโดยไม่ต้องเปลี่ยนแปลง ซึ่งมีค่าอย่างยิ่งสำหรับโปรเจกต์ Kotlin Multiplatform

สำหรับแต่ละแพลตฟอร์ม Ktor ใช้เอ็นจิ้นของตัวเอง บน Android จะใช้ เอ็นจิ้น OkHttp เป็นค่าเริ่มต้น ซึ่งให้ความเข้ากันได้อย่างสมบูรณ์กับระบบนิเวศของ OkHttp บน iOS ใช้ DarwinEngine ซึ่งใช้ URLSession สำหรับ Server — CIOEngine (Coroutine I/O) สามารถระบุเอ็นจิ้นอย่างชัดเจน: HttpClient(OkHttp) { } หรือ HttpClient(Darwin) { }

เมื่อเลือกเอ็นจิ้น ให้พิจารณาความสามารถ: เอ็นจิ้น OkHttp รองรับ HTTP/2 และการรวมการเชื่อมต่อ DarwinEngine ให้การทำงานร่วมกันของเครือข่าย iOS แบบเนทีฟและเซสชัน URLSen พื้นหลัง CIOEngine เป็นการทำงานของคอรูนีนบริสุทธิ์โดยไม่มี dependencies ภายนอก สำหรับเป้าหมายบนเว็บ ใช้ JsEngine หรือ BrowserEngine ซึ่งทำงานผ่าน fetch API

ต้องขอบคุณ API ที่เป็นหนึ่งเดียวกันบนทุกแพลตฟอร์ม โค้ดสำหรับโหลดข้อมูลจึงเหมือนกันบน Android, iOS และ Desktop ซึ่งช่วยลดการทำซ้ำโค้ดลง 60–80% ในโปรเจกต์ KMM เมื่อเทียบกับการแยกการทำงานบน Retrofit (Android) และ URLSession (iOS) ปลั๊กอินก็ทำงานบนทุกแพลตฟอร์มโดยไม่ต้องเปลี่ยนแปลงเช่นกัน

ข้อผิดพลาดทั่วไปเมื่อทำงานกับ Ktor

การละเลยการปิด HttpClient เป็นข้อผิดพลาดที่พบบ่อยใน Ktor HttpClient ทำงาน Closeable และต้องปิดเมื่อแอปพลิเคชันสิ้นสุดผ่าน client.close() ใน Android ทำได้ใน onDestroy() ของ Activity หรือ ViewModel.onCleared() ไคลเอ็นต์ที่ไม่ถูกปิดจะนำไปสู่การรั่วไหลของคอรูนีนและเธรดของเอ็นจิ้น

ลำดับปลั๊กอินไม่ถูกต้อง อาจทำให้การประมวลผลคำขอเสียหาย ตัวอย่างเช่น ContentNegotiation ควรติดตั้งก่อน DefaultRequest เพื่อให้ชนิดเนื้อหาถูกนำไปใช้อย่างถูกต้อง แนะนำให้ติดตั้ง Logging เป็นลำดับสุดท้ายเพื่อบันทึกเวอร์ชันสุดท้ายของคำขอหลังจากการปรับเปลี่ยนทั้งหมด ทดลองกับลำดับหากปลั๊กอินทำงานไม่คาดคิด

ขาดการจัดการข้อยกเว้น ในฟังก์ชัน suspend Ktor จะโยน IOException สำหรับข้อผิดพลาดเครือข่ายและ ClientRequestException สำหรับสถานะ HTTP 4xx บล็อก try-catch เป็นสิ่งจำเป็นสำหรับทุกการเรียก get(), post() และวิธีการอื่นๆ ใช้ HttpResponseValidator ในบล็อก HttpClient สำหรับการจัดการข้อผิดพลาดทั่วโลกโดยไม่ต้องทำซ้ำ try-catch ในแต่ละวิธี

คำถามที่พบบ่อย

Ktor แตกต่างจาก Retrofit อย่างไร?

Ktor ใช้ Kotlin DSL และปลั๊กอินโดยไม่ต้องมีคำอธิบายประกอบและการรีเฟลกชัน Retrofit สร้างขึ้นบนคำอธิบายประกอบของ Java และการรีเฟลกชัน Ktor รองรับหลายแพลตฟอร์ม Retrofit รองรับเฉพาะ JVM/Android Ktor ทำงานร่วมกับคอรูนีนแบบเนทีฟ Retrofit เพิ่ม suspend ผ่าน wrapper

เอ็นจิ้น Ktor ใดดีที่สุดสำหรับ Android?

สำหรับ Android เอ็นจิ้น OkHttp เหมาะสมที่สุด — ให้ความเข้ากันได้กับระบบนิเวศของ OkHttp การรวมการเชื่อมต่อ การแคช และ HTTP/2 เลือกผ่าน HttpClient(OkHttp) { } ทางเลือกคือ CIOEngine ที่มาพร้อมกับ Ktor แต่เสถียรน้อยกว่าบน Android

Ktor รองรับ HTTP/2 หรือไม่?

ใช่ Ktor รองรับ HTTP/2 ผ่านทางเอ็นจิ้นที่เหมาะสม เอ็นจิ้น OkHttp สืบทอดการรองรับ HTTP/2 จาก OkHttp DarwinEngine บน iOS รองรับ HTTP/2 ผ่าน URLSession CIOEngine รองรับ HTTP/2 ฝั่งเซิร์ฟเวอร์ การเลือกเอ็นจิ้นกำหนดระดับการรองรับโปรโตคอล

จะกำหนดค่าการอนุญาตใน Ktor Client ได้อย่างไร?

ใช้ปลั๊กอิน Auth กับการตั้งค่า bearer { } ปลั๊กอินจะเพิ่มส่วนหัว Authorization ให้กับทุกคำขอโดยอัตโนมัติและสามารถรีเฟรชโทเค็นเมื่อได้รับการตอบสนอง 401 ผ่าน refreshTokens ตัวอย่าง: install(Auth) { bearer { loadTokens { BearerTokens(token, refreshToken) } } }

ฉันสามารถใช้ Ktor Client บน iOS ได้หรือไม่?

ใช่ Ktor Client ทำงานอย่างสมบูรณ์บน iOS ผ่าน DarwinEngine ซึ่งใช้ URLSession ปลั๊กอินทั้งหมด การซีเรียลไลซ์ และคอรูนีนทำงานบน iOS เช่นเดียวกับ Android ทำให้ Ktor เป็น HTTP ไคลเอ็นต์หลักสำหรับโปรเจกต์ Kotlin Multiplatform Mobile (KMM)

สรุป

  • Ktor — HTTP คลายนต์แบบอะซิงโครนัสจาก JetBrains รองรับหลายแพลตฟอร์ม
  • Kotlin DSL แทนที่คำอธิบายประกอบ — การกำหนดค่าผ่านบล็อกโปรแกรมโดยไม่ต้องรีเฟลกชัน
  • ปลั๊กอิน ContentNegotiation, Auth, Logging และ HttpTimeout ขยายฟังก์ชันการทำงานแบบโมดูลาร์
  • คอรูนีน — พื้นฐานการทำงาน: วิธีการ suspend ทั้งหมดโดยไม่ต้องใช้ callback และสตรีมแบบรีแอกทีฟ
  • หลายแพลตฟอร์ม — โค้ดเดียวสำหรับ Android, iOS, Desktop, Server และ JS
  • เอ็นจิ้น OkHttp, Darwin, CIO ปรับ Ktor ให้เหมาะกับแพลตฟอร์มเฉพาะ
  • HttpResponseValidator รวมศูนย์การจัดการข้อผิดพลาด HTTP โดยไม่ต้องทำซ้ำ try-catch

เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร

IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ

ปรึกษาโครงการ

อ่านเพิ่มเติม