Kotlin 1.1.61 + Spring で Web Application を作る (2 of 4) の続きです。
Web API を作る
HTMLで表示するViewは作りましたから、次は API を作ります。 一覧が取得できる簡単な API を考えます。
コントローラのメソッドの返り値として、 Kotlin の Map を返すとうまく JSONにして返してくれます。 JSONの形もいろいろと変更できるようにしておきたいので、 TaskJsonView オブジェクト を作り、Map を作る関数を実装します。
JSON用Viewを作る
1 2 3 4 5 6 7 |
src - main - kotlin - com.example.myapp - presentation - task - TaskJsonView.kt |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
package com.example.myapp.presentation.task import com.example.myapp.domain.task.Task object TaskJsonView { fun list(taskList: List<Task>): Map<String, Any?> { return mapOf( "data" to mapOf( "tasks" to taskList.map { mapOf( "id" to it.id, "name" to it.name, "created_at" to it.createdAt?.toString(), "updated_at" to it.updatedAt?.toString() ) } ) ) } } |
Kotlin では mapOf を使って map を定義でき、 JSON 構造 の 見た目を保ちながらオブジェクトを作成することができます。 MutableMap を作って要素をひとつずつ設定していくことも可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
fun list(taskList: List<Task>): Map<String, Any?> { val taskMapList = mutableListOf<Map<String, Any?>>() taskList.forEach { val taskMap = mutableMapOf<String, Any?>() taskMap["id"] = it.id taskMap["name"] = it.name taskMap["created_at"] = it.createdAt taskMap["updated_at"] = it.updatedAt taskMapList.add(taskMap) } val dataMap = mutableMapOf<String, Any?>() dataMap["tasks"] = taskMapList val jsonMap = mutableMapOf<String, Any?>() jsonMap["data"] = dataMap return jsonMap } |
こうしてできた TaskJsonView を TaskController で使用します。 TaskController には次のメソッドを追加します。
1 2 3 4 5 |
@ResponseBody @GetMapping(produces = arrayOf("application/json")) fun listJson(): Map<String, Any?> { return TaskJsonView.list(taskRepository.findAll()) } |
サーバを起動して、 http://localhost:8080/task
へ JSON のGETリクエストをすると、次の結果が返ります。 リクエストヘッダには "Accept=application/json"
をつける必要があります。
1 |
{"data":{"tasks":[{"id":10,"name":"First","created_at":"2017-11-17 10:56:35.555","updated_at":"2017-11-17 10:56:35.555"},{"id":11,"name":"Second","created_at":"2017-11-17 10:56:40.812","updated_at":"2017-11-17 10:56:40.812"},{"id":12,"name":"Third","created_at":"2017-11-17 10:56:43.102","updated_at":"2017-11-17 10:56:43.102"}]}} |
成功時のデータを {"data": { ... }}
という形で返すようにしています。 この枠組みは成功時のJSONレスポンスでは変わらないので共通部分を LayoutJsonView にまとめます。
1 2 3 4 5 6 7 |
src - main - kotlin - com.example.myapp |- presentation - layout - LayoutJsonView |
1 2 3 4 5 6 7 |
package com.example.myapp.presentation.layout object LayoutJsonView { fun success(data: Map<String, Any?>?): Map<String, Any?> { return mapOf("data" to data) } } |
そして TaskJsonView の list メソッドを書き換えます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
fun list(taskList: List<Task>): Map<String, Any?> { return LayoutJsonView.success( mapOf( "tasks" to taskList.map { mapOf( "id" to it.id, "name" to it.name, "created_at" to it.createdAt?.toString(), "updated_at" to it.updatedAt?.toString() ) } ) ) } |
Kotlin 1.1.61 + Spring で Web Application を作る (4 of 4) に続きます。