iT邦幫忙

2022 iThome 鐵人賽

DAY 18
0

Android 程式在三層式架構中屬於展示層,需要與商業邏輯層溝通,而溝通通經常使用 HTTP,所以需要 HTTP client。

Data Transfer Object (DTO)

在介紹 HTTP client 之前先提一下 Data Transfer Object(DTO) 。
物件導向程式設計中資料都是封裝成物件,所以 HTTP 請求與回應也會是物件,這種物件就叫做 DTO,封裝傳輸用到的資料。

Kotlinx Serialization

既然請求回應都是 DTO,那就需要一個機制把物件轉成 HTTP 或相反,這個過程叫做序列化(Serialization)與反序列化(Deserialization)

Kotlin 官方釋出 kotlinx.serialization 套件來處理序列化與反序列化。

加上 @Serializable 標注宣告物件可以序列化,原始型別(String、Int、Double 等等)預設不用任何操作就能序列化。
在屬性加上 @SerialName("NAME") 就能在序列化時指定 key 為 NAME。

@Serializable
data class SSORequest(
    val credential: Credential,
    @SerialName("RedirectService") val redirectSsoService: String,
) {
    @SerialName("Account")
    val account: String = credential.id

    @SerialName("Password")
    val password: String = credential.password
}

序列化成 JSON 後就會產出下面的結構

{
    "RedirectService": "",
    "Account": "",
    "Password": ""
}

Ktor

Ktor 是一個 HTTP server 或 client 函式庫,這裡只會用 client。

val client = HttpClient(CIO)
val html = client.get("https://www.google.com/").body<String>()

安裝 ContentNegotiation 擴充就能支援 kotlinx.serialization,下面的 SSORequest 會自動轉成 JSON,收到的 HTTP 回應 JSON 也會自動反序列化成 SSOResponse。

suspend fun singleSignOn(request: SSORequest): SSOResponse {
    val client = HttpClient(CIO) {
        install(ContentNegotiation) { json() }
    }
    return client.post(SSO_URL) {
        contentType(ContentType.Application.Json)
        setBody(request)
    }.body()
}

安裝 HttpCookies 擴充就能支援 cookie 功能,就能與需要登入的 HTTP 服務正常互動。

val client = HttpClient(CIO) {
    install(HttpCookies)
}

上一篇
Day 17 - Android Kotlin Coroutine
下一篇
Day 19 - Git 版本控制
系列文
關於我用 Compose UI 造新輪子這檔事24
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言