vault backup: 2025-07-22 22:14:08
Affected files: Too many files to list
This commit is contained in:
@@ -1,82 +0,0 @@
|
||||
---
|
||||
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
|
||||
```
|
||||
Reference in New Issue
Block a user