#16 [SpringBoot/KotlinでBFF]新規追加 POSTの実装

新規のタスクを追加する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"
}

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

コード

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

コメントを残す

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

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