本文へスキップ
BecomeCoder

Spring / Spring Bootコース · 第4章 Web ― REST APIを作る · レッスン13

URLごとの振り分け ― @GetMapping/@PostMappingとパス変数・クエリ

ローカル実施

導入

/api/users/1 にアクセスされたらこの処理」「/api/users にPOSTされたらこの処理」——URLHTTPメソッドの組み合わせごとに処理を振り分ける仕組みが必要です。

説明

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とアノテーションはそれぞれどう書けそうか考えてみましょう。