iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 12
0
Mobile Development

老姐好像要用 Kotlin 寫專案,能撐30天嗎?系列 第 12

互相分享的第十二天:前後端都用 Kotlin 的好處

  • 分享至 

  • xImage
  •  

老姐亮出她的 App 畫面說今天準備接我的 post Api 。
https://ithelp.ithome.com.tw/upload/images/20200921/20129197k2Ll3y7fBo.png

我露出抱歉的表情和她說了目前只有 題目列表 GET /api/topics 可用。
她微笑地把她寫的 Android 串接部分 Request 和 Response 的物件類別,複製給我,在這種趕工的時刻深深體會前後端統一用 Kotlin 還是有好處的。

Android 串接的部分:

    @GET("/api/topics/{id}")
    suspend fun getTopicDetail(@Path("id") id: String): TopicDetail

    @POST("/api/topics")
    suspend fun postTopic(@Body body: TopicRequest): TopicDetail

    @DELETE("/api/topics/{id}")
    suspend fun deleteTopic(@Path("id") id: String)
data class TopicRequest (
    val title: String,
    val description: String,
    val tags: String
)
data class TopicDetailResponse (
        val id: UUID,
        val avatar: String,
        val name: String,
        val description: String
)

我滿懷感激地拿後面兩個類別來用。

        get("/api/topics/{id}") {
            val topicId = call.parameters["id"]

            val topic = transaction {
                Topic.findById(UUID.fromString(topicId))?.let {
                    TopicDetailResponse(
                            id = it.id.value,
                            name = it.title,
                            avatar = "https://imgur.com/l0swFL1.jpg",
                            description = it.description
                    )
                }
            }
            if (topic != null) {
                call.respond(topic)
            } else {
                call.response.status(HttpStatusCode.NotFound)
            }
        }
        post("/api/topics") {
            val request = call.receive<TopicRequest>()
            val topic = transaction {
                 Topic.new {
                     author = User.all().first().id.value
                     title = request.title
                     description = request.description
                     tags = request.tags
                     completed = false
                     createdAt = DateTime.now()
                     updatedAt = DateTime.now()
                }.let {
                    TopicDetailResponse(
                            id = it.id.value,
                            name = it.title,
                            avatar = "https://imgur.com/l0swFL1.jpg",
                            description = it.description
                    )
                }
            }
            call.respond(topic)
        }
        delete("/api/topics/{id}") {
            val topicId = call.parameters["id"]
            transaction {
                Topic.findById(UUID.fromString(topicId))?.delete()
            }
            call.respond(HttpStatusCode.NoContent)
        }

當遇到 Server 無法處理的問題,程式會拋出例外錯誤 Exception ,這時候 http 狀態碼預設是 500 。
都是 500 的話難以在第一時間知道錯誤原因,所以我傾向把可以預測的錯誤用其他狀態碼表示,其他的錯誤再連進後臺看錯誤紀錄 error log。

GET /api/topics/{id} 有對應資料。

https://ithelp.ithome.com.tw/upload/images/20200921/20129197xrNfeX32Nn.png

GET /api/topics/{id} 沒有對應資料。
https://ithelp.ithome.com.tw/upload/images/20200921/20129197MU2LNT7vts.png

以上 Http get 的方法都可以直接用瀏覽器測試,但是其他像是 delete, post 之類的需要 client 端輔助。

之前有用過 Postman 之類的工具,不過如果老姐開發的夠快,就能直接拿她的 app 來測試。

從她緩慢打字的動作可以推測今天老姐做不完了,可喜可賀,可喜可賀,這下終於換成老姐要配合我的進度了。

本次鐵人賽的作品在放進更多內容後已經成書,書名是《老姐要用Kotlin寫專案:從 Server 到 Android APP 的開發生存日記》,歡迎購買唷。https://www.tenlong.com.tw/products/9789864348978


上一篇
內部進化的第十一天:動起來吧,資料庫!塞資料的時機到了!
下一篇
任重道遠的第十三天:來自網路另一端的協助
系列文
老姐好像要用 Kotlin 寫專案,能撐30天嗎?30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言