新規のタスクを追加するAPIを実装する。
Controller層
リクエストのbodyはタスク情報。
レスポンスのHTTP statusは201 Createdを返す。bodyは追加したタスク情報を返す。
@PostMapping("/")
@ResponseBody
@ResponseStatus(HttpStatus.CREATED)
fun createTask(@RequestBody task: Task): Task {
return taskService.createTask(task)
}
Service層
Service層でFrontend向けのモデルから外部API向けのモデルに変更する。レスポンスはその逆を行う。(Taskという同じクラス名にしたので分かりづらくなってしまった。こういう場合、クラス名で違いが分かるようにした方が良さそう)
ここではタスクのデフォルトユーザーをUNKNOWNとしてレスポンスデータを返している。こういったサービスの仕様に関わる部分はService層で行う。
fun createTask(task: Task): Task {
val postTask = taskRepository.postTask(
com.example.bffsample.model.externalapi.Task(
title = task.title,
description = task.description
)
)
return Task(
taskId = postTask?.taskId ?: 0,
title = postTask?.title ?: "",
description = postTask?.description ?: "",
userName = UNKNOWN_USER_NAME)
}
Repository層
RestTemplateでpostする関数は他にもあるようだけどひとまず最も簡単なpostForObjectを使用。
fun postTask(task: Task): Task? {
val uri = "$taskApiUrl/tasks/"
return restTemplate?.postForObject(uri, task, Task::class)
}
確認
POSTMANで実際にリクエストを投げてみて確認。
(外部APIのTask-API側はPOSTするとタスク情報と共に発行したTaskIdを返すように設定してある。)
リクエスト
http://localhost:8080/tasks/
{
"title": "タスクのタイトル",
"description": "タスクの詳細説明"
}
レスポンス
{
"taskId": 1,
"title": "タスクのタイトル",
"description": "タスクの詳細説明",
"userName": "unknown"
}
想定どおりの動作を確認できた。
コメントを残す