--- tags: aliases: date: 2024-06-05 time: 19:06:00 description: --- Ktor是由Kotlin提供的一個framwork。 要在Android使用Ktor,需要在build.gradle加入以下的dependency: ``` implementation "io.ktor:ktor-server-core:2.0.1" // Ktor的核心包 implementation "io.ktor:ktor-server-jetty:2.0.1" // 供Ktor使用的引擎包,另外有Jetty, Tomcat, CIO可用 implementation "io.ktor:ktor-gson:1.2.5" // implementation "io.ktor:ktor-server-call-logging:2.0.1" // 用於印出Request及Response的log用 // implementation "io.ktor:ktor-server-partial-content:2.0.1" // 用於支援PartialContent用 // implementation "io.ktor:ktor-server-cors:2.0.1" // 用於支援CORS用 // implementation "io.ktor:ktor-server-html-builder:2.0.1" // 用於回傳客製html用 ``` 在`packagingOptions`裡,也需要加入以下的設定來必面編譯問題[[Ktor#^68d958 ]] : ``` packagingOptions { exclude 'META-INF/*' } ``` 在`AndroidManifest.xml`中,記得加入internet的權限: ``` ``` 然後就是 HTTP Server 的 code 了,注意 Netty 在 Android 上不能用,要改用 Jetty 或是 CIO: ```kotlin import io.ktor.server.jetty.Jetty import io.ktor.server.engine.embeddedServer import io.ktor.server.routing.routing import io.ktor.server.routing.get import io.ktor.server.application.* import io.ktor.server.response.respondText embeddedServer(Jetty, 9000) { routing { get("/") { call.respondText("Hello, world!") } } }.start(wait = false) ``` 但是這段code會block,所以需要一個thread把它包起來: ```kotlin Thread { httpEngine = embeddedServer(Netty, 8080) { install(ContentNegotiation) { gson {} } routing { get("/") { call.respond(mapOf("message" to "Hello world")) } get("/say/{something}") { call.respond(mapOf("message" to "You say: " + call.parameters["something"])) activity?.findViewById(R.id.textView)?.text = "You say: " + call.parameters["something"] } } }.start(wait = false) }.start() ``` # 參考來源 - 如果沒有這一段會產生如下錯誤 ^68d958 ``` 13 files found with path 'META-INF/INDEX.LIST'. Adding a packagingOptions block may help, please refer to https://developer.android.com/reference/tools/gradle-api/7.4/com/android/build/api/dsl/ResourcesPackagingOptions for more information ```