82 lines
2.6 KiB
Markdown
82 lines
2.6 KiB
Markdown
---
|
||
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的權限:
|
||
```
|
||
<uses-permission android:name="android.permission.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<TextView>(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
|
||
``` |