Ktor 是一套 Jetbrains 自己開發的前後端通包的網路連線 framework,因為純 Kotlin 加上又是自家產品,所以可以說是 KMM 的官方推薦連線工具,我們今天主要會著重在 client 端上的教學,之後有機會的話我們再跳到 server 的角度來看他的整體設計理念。
這也再度證明了 Jetbrains 真是一家有雄心壯志的公司 XD
首先也是要加上 dependency 的宣告:
implementation("io.ktor:ktor-client-core:2.1.0")
implementation("io.ktor:ktor-client-cio:2.1.0")
第一行蠻單純可以理解為 Ktor 的核心,但第二行 CIO 是個什麼東西呢?
如我們一開始的說明,Ktor 在設計之初就有支援 Kotlin multiplatform 的概念在裡頭,可以透過置換不同的 engine 來讓 Ktor 可以在各種不同平台下都可以順利運作,而 CIO 呢,就是一個 Android/iOS 通用的 engine,其實除了 CIO 以外也還有許多其他的 engine,或許看了以下的 engine 列表以後大家會更了解 engine 是個怎麼樣的存在,如下:
Engine | Platforms |
---|---|
Apache | JVM |
Java | JVM |
Jetty | JVM |
Android | JVM, Android |
OkHttp | JVM, Android |
Darwin | Native |
Curl | Native |
CIO | JVM, Android, Native |
Js | JavaScript |
不同的 engine 所支援的功能或是限制也會有些落差,而且會跟著不同版本而有不同的支援程度,我們這邊就不複製貼上了,建議使用前先到官網稍微研究一下:
https://ktor.io/docs/http-client-engines.html#minimal-version
https://ktor.io/docs/http-client-engines.html#limitations
當你決定好一個 engine 之後,就可以很簡單的把 Ktor 的 HttpClient 建立起來,以下是以 CIO 這個 engine 為例的範例:
import io.ktor.client.*
import io.ktor.client.engine.cio.*
val client = HttpClient(CIO)
當然你也可以調整任何你想要的設定,一個簡單範例如下:
HttpClient(CIO) {
engine {
// this: HttpClientEngineConfig
threadsCount = 4
pipelining = true
}
}
Ktor 核心只提供主要連線的功能,但我們知道需求總是五花八門的,這時候就是各式各樣 plugin 入場的時機了,不管是 logging、serialization 或是 auth,在 Ktor 的世界都可以使用 plugin 來完成,以下我們使用 logging 來做範例,首先一樣是要加上 dependency:
implementation("io.ktor:ktor-client-logging:2.1.0")
implementation("ch.qos.logback:logback-classic:1.3.0")
跟開頭的 engine 跟 CIO 一樣,這邊第一行的 client-logging 很好理解,但第二行 logback 可能大家會覺得蠻奇怪的,其實 Ktor 的 JVM logging 預設是使用 SLF4J (Simple Logging Facade for Java),而 logback 是其中一種實作,如果沒有加的話其實 Ktor 也會跳出些 warning 來提醒。
使用上也非常簡單,只要在 HttpClient 的 block 裡,透過 install 這個 function 把你想要的 plugin 加進來就可以了,logging 的範例如下:
import io.ktor.client.*
import io.ktor.client.engine.cio.*
import io.ktor.client.plugins.logging.*
val client = HttpClient(CIO) {
install(Logging)
}
有沒有覺得跟剛剛的 engine config 很像呢?畢竟是 Kotlin 團隊開發的,整個思路都非常的 Kotlin 對吧!
這樣就會得到預設的 logging 設定,如果你想要掌握更多控制權的話也沒問題,一個簡單的範例如下:
val client = HttpClient(CIO) {
install(Logging) {
logger = Logger.DEFAULT
level = LogLevel.HEADERS
filter { request ->
request.url.host.contains("ktor.io")
}
}
}
其實 DEFAULT 跟 HEADERS 就是 logger 跟 level 預設的參數,以 logger 來說,總共有 DEFAULT、SIMPLE、NONE這三種可選擇,DEFAULT 是使用 logback 來 print log,我們也可以把它換成 SIMPLE 就會直接使用 println,甚至也建立一個 custom 的 logger 來讓他更符合你的使用情境。而 level 的部分也可以依照我們自己的需求選擇 ALL、HEADERS、BODY、INFO 或是 NONE。最後一個 filter 的參數應該也很好理解,透過這個 function 我們可以過濾出我們感興趣的連線,只選取符合規則的連線。
光建立 HttpClient 就花了蠻多篇幅呢,是不是很有趣呢?明天我們將繼續使用建立的 HttpClient 來建立連線,不要錯過了喔!