前回↓
次回↓
3. GET、POST、PUT、DELETEの実装
3-1. Postmanのインストール
- ブラウザではPOST、PUT、DELETEメソッドを送信できないため、Postmanをインストールします。
https://www.postman.com/
より、Postmanをダウンロードして、インストールします。
Postman-win64-Setup.exe
を起動するとインストール&起動します。
- demoアプリケーションを起動して、GETメソッドで、
http://localhost:8080/todos
にアクセスすると、以下のようにJSONが返却されればOKです。
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の動作確認
- POSTMANから、 http://localhost:8080/todo/1 を送信すると、以下のように出ればOKです。
- http://localhost:8080/todo/100 のように存在しないidを指定すると、404 Not Found が出ます。
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の動作確認
- 以下のJSONをPOSTで http://localhost:8080/todo に送信します。
{
"title": "旅行の計画",
"description": "夏休みに家族と海外旅行",
"isCompleted": false
}
- H2Console http://localhost:8080/h2-console/ でも入っていることが確認できました。
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の動作確認
- 以下のJSONをPUTで http://localhost:8080/todo/1 に送信します。
{
"title": "歯医者の予約",
"description": "歯医者の予約を取る",
"isCompleted": false
}
- H2Console http://localhost:8080/h2-console/ でも更新されていることが確認できました。
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の動作確認
- DELETEで http://localhost:8080/todo/1 に送信します。
- H2Console http://localhost:8080/h2-console/ でも削除されていることが確認できました。
おわり