Kotlin 一條龍 - 打造全平台應用

活動訊息
Kotlin 一條龍 - 打造全平台應用

聽完這場分享後,您將了解如何用 Kotlin 打造全平台應用,並且對 Ktor 的 Client 元件及 Server 運作有更進一步的認識。

活動日期:2020 年 07 月 24 日

活動時間:PM 03:00

主辦單位:

 
講者簡介
Nevin Chen
Mozilla Senior Developer

Nevin 是 Mozilla 資深工程師,從 Android 到 Server-Side 開發都有涉獵,使用 Kotlin 已有超過 6 年的經驗,目前正在用 Ktor 開發 Mozilla 的開放原始碼專案。

范聖佑
JetBrains Developer Advocate

JetBrains 技術傳教士,負責推廣 IntelliJ IDEA 系列 IDE 及 YouTrack、TeamCity、Upsource 等團隊合作解決方案,協助開發者善用工具輔助來提升生產力,同時維護程式碼品質。

是不是好奇學了 Kotlin 後可以拿來寫什麼樣的應用呢?答案是幾乎各種應用!由於 Kotlin 支援多平台的特性,讓我們有機會用一種程式語言,就可以跨足到前端、兩種 Mobile 平台(iOS 及 Android)及後端,真正做到所謂一條龍的境界。本次線上技術講座,聖佑和 Nevin 兩人聯手示範如何用 Kotlin 打造出的 Ktor 框架寫出 Android App 及 JSON API,輕鬆打造全平台應用。

主題分享

Ktor 開發 API

在本次的分享裡,聖佑和 Nevin 分工合作,由 Nevin 負責撰寫 Android App、聖佑負責撰寫後端 API。Nevin 首先拿 Android 官方 Test Codelab 的 TODO App 做基礎,實際執行給大家看這個 Android App 跑起來的介面及操作行為。聖佑依照這個介面拆解出這個 App 所需後端 API 的 JSON 資料格式,再依照這個格式設計出前後端資料交換所需使用的 Data Class,方便 JSON Library(使用 GSON 示範)做轉換。有這樣的基礎後,聖佑在專案裡引入同樣由 JetBrains 開發的 Exposed SQL Framework,依照 JSON 格式的欄位,推導出對應的資料表 Object 及 DAO 物件。如此就可以快速地在資料庫裡建立資料表,也可以用 DAO 物件預先寫入測試用的資料。接著,使用 Ktor 的 Routing DSL 語法,定義 RESTful API 所使用的 HTTP Method、路徑及回應動作,再以 Jib 將 Ktor 打包成 Image 後部署,一個後端 API 就在約 25 分鐘內實作完成。

Android App 架構

原本的 TODO App 只是一個將資料儲存在手機本地的 App,為了讓這個資料可以同步到雲端,Nevin 將 Ktor 的 HTTP Client 安裝到架構裡的 Remote Data Source,在定義好 Reqeust 及 Response 等 Data Class 後,就可以與後端 API 交換資料。當資料從後端取回後,只要同步回 Local Data Source,就會自動從 Reposiroty、View Model 一路更新到 UI 顯示。Nevin 強調,只要有好的程式架構,抽換資料來源甚至是抽換 HTTP Client 都很容易,程式也很好測試與維護。最後,Nevin 還分享了兩個由他操刀的 Mozilla 開放原始碼專案:PushServiceWorkermango_backend。PushServiceWorker 是一個由 Ktor 實作的 Pub/Sub 服務、mango_backend 則是一個由 Spring Boot 實作的後台服務,兩個專案雖然用的框架不同,但都是 100% 使用 Kotlin 做開發。

從這次兩人通力合作的專案可以看到 Kotlin 在跨平台開發上的潛力,Nevin 也鼓勵所有的 Android 開發者好好利用這個特性,試著自己打造自己需要的 API,在擴增開發視野的同時,也能變成一個更好的 Mobile 開發者。而在可見的未來,Kotlin 開發者的技術職涯將更為寬廣,Kotlin 全端開發不再是夢想!

問答

Q. 請問 Ktor 支援 OpenAPI/Swagger 的官方整合嗎?如果有,有沒有實作可以參考?如果沒有,有其他 API 文件產生器能搭配 Ktor 使用呢?

聖佑:目前 Ktor 官方並沒有針對 OpenAPI/Swagger 做整合,我自己對這一部份也還沒有經驗。不過可以參考一下社群內轉貼的 ktor-swagger 套件,看看符不符合需求。JetBrains 內部正在幫 Ktor 做一系列的更新,包括網站、文件…等,未來也會推出更多功能,請大家持續關注 Ktor 官網。

Q. 除了 Scratch File 可以模擬 HTTP Client 做測試,如果要寫自動測試案例,有什麼方法呢?

聖佑:IntelliJ IDEA 裡的 HTTP Request 功能是用在開發過程中,測試自己或第三方寫出來的 API 回應,可以拿來取代 Postman 的功能。不過,若是要在 CI 上自動化測試 API 的話,還是會建議用測試框架比較適合。

Q. 可以展示一下如何使用 Google Cloud Platform 的 Jib 工具嗎?

聖佑:請參考範例檔裡的 cloudbuild.yaml 和 auto-jib.gradle 兩個檔案。GCP 在抓取更新的時候,會自動去看 cloudbuild.yaml 裡的 Cloud Build 設定,並依 auto-jib.gradle 裡的設定的 Jib Gradle 外掛將 Ktor 應用程式封裝成一個 Image 後放到 Registry 裡,然後可以再依需求部署到如 Cloud Run 上。詳細的步驟和細節,我可以再安排另一場做專門的介紹。

Q. 請問 Transaction 建立幾筆資料後,中途發生 Exception,那已建立的資料會存到資料庫嗎? 還是就算此 Transaction 就失敗了,所以全部資料就不會建立?

聖佑:根據我初步測試的結果,Transaction 裡的動作是一起的。也就是說,假如中途發生 Exception 的話,已建立的資料也不會存到資料庫。更多關於 Transaction 的細節,可以參考一下 Exposed 的 Wiki

Q. Ktor 如何丟出 Error Response Code/Body?

聖佑:假如是想要在 Response 時丟出不同的 HTTP Status Code 的話,我們可以用 Ktor 裡的 HttpStatusCode 物件,上面有很多已經定義好語意外的常數,像 NoContent 代表 204。若是想在 Ktor 裡 Handle Exception 的話,可以參考 Ktor 官網的 StatusPages Feature

Nevin:這部份我會提醒大家儘量利用現存的 Exception,而不要一直建立新的 Exception,這樣在長期維護時會不好維護。另外,每一個 API 特定 Exception 獨立處理會比較方便 Debug,不要所有 Exception 都依賴 Global Exception Handler。

Q. 請問使用 Ktor 取得大量資料後寫到 Room 速度會慢嗎?

Nevin:Room 會慢跟使用哪個 Http Client 沒有直接的關係。這點可能要實際看 Room 慢的原因,查一下問題是出在 Remote 還是 Local?或是因為沒有設定好 Index?再依不同的情境來解決。

Q. Android Ktor Client Stetho 也有支援嗎?

Nevin:Ktor Client 只是一個 Wrapper,本身並沒有發 Request 的能力,所以從這樣的角度來看,應該是要可以支援。但我沒有實際試過,需要再查一下。

Q. 請問所需要的軟體工具有那些?

聖佑:可以直接使用 IntelliJ IDEA Ultimate 版,就可以拿來開發 Android、Ktor 兩種程式,還可以支援像資料庫、HTTP Client 等功能。若是只想開發 Android 的話,可以用 Android Studio、若想先試寫一個 Ktor 的話,可以用 IntelliJ IDEA Community 版。

Q. 未來能開 Kotlin Ktor + iOS 一條龍的介紹嗎?

聖佑:可以,目前正在等 Kotlin 1.4 的發佈。在接下來的這個新版裡,會有更多關於跨平台開發,也就是用 Kotlin 同時開發 Android 及 iOS 兩個平台的功能。待新版公佈後,我們也會安排對應的分享,敬請期待!

問卷調查

在本次活動的問答時間,我們簡單的進行了三題問卷調查,在這邊一併分享統計結果給大家參考:

Q. 您目前已經有在寫 Android 或 Ktor 嗎?

問卷結果1

Q. 今天最有收獲的部份是?

問卷結果2

Q. 聽完今天的分享後,您希望可以深入學習哪個主題?

問卷結果3

從問卷的結果看來,有不少朋友本身是 Android 開發者,對於可以用自己已經熟悉的 Kotlin 加上 Ktor 跨足後端感到很有興趣呢!希望這次的「Kotlin 一條龍 - 打造全平台應用」能讓大家對用 Ktor 寫 API 以及如何將前端、後端串接在一起有更深入的認識,未來我們還會舉辦跟 Kotlin、Ktor 有關的深入分享,歡迎大家持續關注!我們下次見!

講者投影片

範例程式碼