老姐亮出她的 App 畫面說今天準備接我的 post Api 。
我露出抱歉的表情和她說了目前只有 題目列表 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}
有對應資料。
GET /api/topics/{id}
沒有
對應資料。
以上 Http get 的方法都可以直接用瀏覽器測試,但是其他像是 delete, post 之類的需要 client 端輔助。
之前有用過 Postman 之類的工具,不過如果老姐開發的夠快,就能直接拿她的 app 來測試。
從她緩慢打字的動作可以推測今天老姐做不完了,可喜可賀,可喜可賀,這下終於換成老姐要配合我的進度了。
本次鐵人賽的作品在放進更多內容後已經成書,書名是《老姐要用Kotlin寫專案:從 Server 到 Android APP 的開發生存日記》,歡迎購買唷。https://www.tenlong.com.tw/products/9789864348978