導入
「/api/users/1 にアクセスされたらこの処理」「/api/users にPOSTされたらこの処理」——URLとHTTPメソッドの組み合わせごとに処理を振り分ける仕組みが必要です。
説明
Springでは、メソッドに @GetMapping や @PostMapping を付けることで、どのURL・どのHTTPメソッドに対応するかを宣言します。
@RestController
@RequestMapping("/api/users") // このコントローラ共通のパス
class UserApiController {
@GetMapping // GET /api/users
public List<User> list() {
return userService.findAll();
}
@GetMapping("/{id}") // GET /api/users/{id}(例: /api/users/5)
public User get(@PathVariable Long id) {
return userService.findById(id);
}
@PostMapping // POST /api/users
public User create(@RequestBody User newUser) {
return userService.save(newUser);
}
}
URLの一部を変数として受け取りたいときは @PathVariable、?page=2&size=10 のようなクエリパラメータを受け取りたいときは @RequestParam を使います。
@GetMapping("/{id}") // /api/users/5 の "5" を id として受け取る
public User get(@PathVariable Long id) {
return userService.findById(id);
}
@GetMapping("/search") // /api/users/search?keyword=山田&page=2
public List<User> search(
@RequestParam String keyword,
@RequestParam(defaultValue = "1") int page) {
return userService.searchByName(keyword, page);
}
HTTPメソッドとアノテーションの対応は、REST APIの慣習にそのまま対応しています。
| HTTPメソッド | アノテーション | 一般的な意味 |
|---|---|---|
| GET | @GetMapping | データを取得する |
| POST | @PostMapping | 新しいデータを作成する |
| PUT | @PutMapping | データを丸ごと更新する |
| DELETE | @DeleteMapping | データを削除する |
@PathVariable は「そのリソースを一意に指すID」(/users/5)に、@RequestParam は「絞り込みやオプション」(?keyword=山田)に使う、という使い分けを意識すると設計に迷いにくくなります。
やってみよう
「ある注文(ID: 42)の詳細を取得する」「注文一覧をステータス(pending, shipped 等)で絞り込んで取得する」の2つのAPIを設計するなら、URLとアノテーションはそれぞれどう書けそうか考えてみましょう。