Files
Obsidian-Main/20.01. Android/Ktor.md

82 lines
2.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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
```