LoginSignup
1
0

Spring Boot + Kotlin でRESTアプリ作成ハンズオン3

Last updated at Posted at 2023-07-07

前回↓

次回↓

3. GET、POST、PUT、DELETEの実装

3-1. Postmanのインストール

  • ブラウザではPOST、PUT、DELETEメソッドを送信できないため、Postmanをインストールします。

https://www.postman.com/
より、Postmanをダウンロードして、インストールします。

image.png

image.png

Postman-win64-Setup.exe を起動するとインストール&起動します。

image.png

  • demoアプリケーションを起動して、GETメソッドで、http://localhost:8080/todos にアクセスすると、以下のようにJSONが返却されればOKです。

image.png

3-2. GETメソッドを追記& ReesponseEntity で返却する

3-2-1. TodoControllerクラスの修正

  • 前回はTodoListすべてを取得する @GetMapping("/todos") を実装しましたが、今回は id を指定した1つのTodoを取得するメソッドを実装します。
  • @PathVariable アノテーションは、URLの中の値(id)を取り出して、引数にセットします。
  • findByIdの戻り値は、Optional 型なので、値があればの map メソッドによりResponseEntity.okに変換して返却します。
  • 値が無ければ、 orElse メソッドにより、NotFoundを返却します。
TodoController.kt(以下を追記します)
    @GetMapping("/todo/{id}")
    fun getTodoById(@PathVariable("id") id: Long): ResponseEntity<Todo> {
        return todoRepository.findById(id).map { todo ->
            ResponseEntity.ok(todo)
        }.orElse(ResponseEntity(HttpStatus.NOT_FOUND))
    }

3-2-2. GETの動作確認

image.png

image.png

3-3. POSTメソッドの作成

3-3-1. Todoエンティティクラスの修正

  • Todo.kt(エンティティクラス)のcreatedAt,updatedAtが自動的に入るようにするために、以下のように修正、追記します。
Todo.kt
package com.example.demo

import org.springframework.data.annotation.CreatedDate
import org.springframework.data.annotation.LastModifiedDate
import java.time.OffsetDateTime
import javax.persistence.*

@Entity
@Table(name = "todo")
class Todo(

        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        var id: Long? = null,

        @Column(name = "title")
        var title: String,

        @Column(name = "description")
        var description: String?,

        @Column(name = "is_completed")
        var isCompleted: Boolean,

        @Column(name = "created_at")
        @CreatedDate    // <- 追記
        var createdAt: OffsetDateTime?, // <- ?を付ける

        @Column(name = "updated_at")
        @LastModifiedDate   // <- 追記
        var updatedAt: OffsetDateTime? // <- ?を付ける
        
) {
    // 以下を追記
    
    @PrePersist
    fun prePersist() {
        createdAt = OffsetDateTime.now()
        updatedAt = OffsetDateTime.now()
    }

    @PreUpdate
    fun preUpdate() {
        updatedAt = OffsetDateTime.now()
    }
}

3-3-2. TodoControllerクラスの修正

  • @RequestBodyアノテーションはJSONデータを対応するオブジェクトに変換します。
  • letは、前(レシーバ)の結果を受け取ってラムダ式で処理します。
  • 以下のメソッドを追記します。
TodoController.kt
    @PostMapping("/todo")
    fun postTodo(@RequestBody todo: Todo): ResponseEntity<Todo> {
        return todoRepository.save(todo).let {
            ResponseEntity.ok(it)
        }
    }

3-3-3. POSTの動作確認

{
  "title": "旅行の計画",
  "description": "夏休みに家族と海外旅行",
  "isCompleted": false
}

image.png

image.png

3-4. PUTメソッドの作成

3-4-1. TodoControllerクラスの修正

  • findById()で取得したTodoがあれば、新しいTodoを作成して中身を更新したレスポンスを 200 OK で返却し、なければ 404 NOT_FOUND を返却します。
TodoController.kt(以下を追記します)
    @PutMapping("/todo/{id}")
    fun putTodoById(@PathVariable("id") id: Long,
                    @RequestBody todo: Todo): ResponseEntity<Todo> {
        return todoRepository.findById(id).map { oldTodo ->
            val newTodo = Todo(
                        id = id,
                        title = todo.title,
                        description = todo.description,
                        isCompleted = todo.isCompleted,
                        createdAt = oldTodo.createdAt,
                        updatedAt = oldTodo.updatedAt
                )
            ResponseEntity.ok().body(todoRepository.save(newTodo))
        }.orElse(ResponseEntity(HttpStatus.NOT_FOUND))
    }

3-4-2. PUTの動作確認

{
  "title": "歯医者の予約",
  "description": "歯医者の予約を取る",
  "isCompleted": false
}

image.png

image.png

3-5. DELETEメソッドの作成

3-5-1. TodoControllerクラスの修正

  • findById()で取得したTodoがあればdelete()メソッドで削除して、中身を空にしたレスポンスを 200 OK で返却し、なければ 404 NOT_FOUND を返却します。
TodoController.kt(以下を追記します)
    @DeleteMapping("/todo/{id}")
    fun deleteTodoById(@PathVariable("id") id: Long): ResponseEntity<Unit> {
        return todoRepository.findById(id).map { todo ->
            todoRepository.delete(todo)
            ResponseEntity.ok().build<Unit>()
        }.orElse(ResponseEntity(HttpStatus.NOT_FOUND))
    }

3-5-2. DELETEの動作確認

image.png

image.png

おわり

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0