#18 [SpringBoot/KotlinでBFF]更新 PUTの実装

タスク情報を更新する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"
}

想定どおりの動作を確認。

コード

https://github.com/little-engineer/bff-sample/pull/22/files

コメントを残す

メールアドレスが公開されることはありません。

ABOUT US
little
15年以上プログラマーをしているエンジニアです。Kotlin, Java, Python, C++を使用したServerSideの開発に携わってきました。とりあえずやってみるスタイルで記事を更新していきます。