Android 程式在三層式架構中屬於展示層,需要與商業邏輯層溝通,而溝通通經常使用 HTTP,所以需要 HTTP client。
在介紹 HTTP client 之前先提一下 Data Transfer Object(DTO) 。
物件導向程式設計中資料都是封裝成物件,所以 HTTP 請求與回應也會是物件,這種物件就叫做 DTO,封裝傳輸用到的資料。
既然請求回應都是 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 是一個 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)
}