タスク情報を更新するAPIを実装する。
Controller層
クエリーパラメータに更新する対象のIDを指定、リクエストbodyで更新する情報を受け取る。レスポンスのHTTP statusはPOSTと違い新規作成ではないのでGETと同じく200 OKを返す。レスポンスbodyは更新した情報を返す。
@PutMapping("/{taskId}")
@ResponseBody
@ResponseStatus(HttpStatus.OK)
fun updateTask(
@PathVariable("taskId") taskId: Int,
@RequestBody task: Task): Task {
return taskService.updateTask(taskId, task)
}
Service層
Service層でFrontend向けのモデルから外部API向けのモデルに変更する。レスポンスはその逆を行う。ここではタスク情報を変更した上で不足しているユーザー情報を取得してレスポンスデータを返却。
fun updateTask(taskId: Int, task: Task): Task {
val putTask = taskRepository.putTask(
taskId,
com.example.bffsample.model.externalapi.Task(
taskId = taskId,
title = task.title,
description = task.description
)
)
val user = userRepository.getUser(taskId)
return Task(
taskId = putTask?.taskId ?: 0,
title = putTask?.title ?: "",
description = putTask?.description ?: "",
userName = user?.userName)
}
Repository層
RestTemplateでレスポンスを受け取るためにexchangeを使用。putという関数もあるけどこちらは戻り値が無い。
fun putTask(taskId: Int, task: Task): Task? {
val uri = "$taskApiUrl/tasks/$taskId"
val requestEntity = HttpEntity<Task>(task)
val responseEntity: ResponseEntity<Task>? = restTemplate?.exchange(
uri, HttpMethod.PUT, requestEntity, Task::class)
return responseEntity?.body
}
確認
POSTMANで実際にリクエストを投げてみて確認。
(外部APIのTask-API側はPUTするとタスク情報を返すように設定してある。)
リクエスト
http://localhost:8080/tasks/12345
{
"title": "タスクのタイトルをアップデート",
"description": "タスクの詳細説明をアップデート"
}
レスポンス
{
"taskId": 12345,
"title": "タスクのタイトルをアップデート",
"description": "タスクの詳細説明をアップデート",
"userName": "タスクの管理者A"
}
想定どおりの動作を確認。
コメントを残す