iT邦幫忙

2022 iThome 鐵人賽

DAY 18
0
Mobile Development

Kotlin 全面啟動 系列 第 18

[Kotlin 全面啟動] Ktor Client

  • 分享至 

  • xImage
  •  

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 是個什麼東西呢?

Engine

如我們一開始的說明,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
    }
}

Plugin

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 來建立連線,不要錯過了喔!


上一篇
[Kotlin 全面啟動] Serialization
下一篇
[Kotlin 全面啟動] Ktor Client II
系列文
Kotlin 全面啟動 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言