【Spring】Spring MVCでのWeb APIの作り方まとめ

2020年12月7日

コントローラの作成

Spring MVCでWeb APIを作る際には@RestControllerアノテーションを使用するのが一般的です。@RestControllerをコントローラクラスに付与します。@RestControllerを付与されたクラス内に定義された@GetMappingなどリクエスト処理用のアノテーションを付与したメソッドからオブジェクトをreturnすると、Spring MVCによりJSONに変換されてHTTPレスポンスのボディとなります。

GETリクエストの処理

GETリクエストを処理するためにはメソッドに@GetMappingアノテーションを付与します。パス変数を使用する場合は@PathVariableアノテーション、リクエストパラメータを使用する場合は@RequestParamアノテーションを使用します。

パス変数は@GetMappingアノテーションの引数の中で"{}"で囲みます。そして、同じ名前の引数を@PathVariableアノテーションを付けて定義します。

リクエストパラメータは@RequestParam(“{パラメータ名}")をメソッドに引数に付与することで定義します。

下の例ではGETリクエストのパス変数とリクエストパラメータで受け取った値をidとnamenに持つJSONを返します。

// インポートは省略

@RestController
public class ItemController {

    @GetMapping("items/{id}")
    public ItemResponse get(@PathVariable("id") int id, @RequestParam("name") String name) {

        return new ItemResponse(id, name, 100);
    }
}

レスポンス用のItemResponseを以下のように定義しています。Lombokを使用してゲッター、セッター、コンストラクタを生成しています。

@Data
@NoArgsConstructor
@AllArgsConstructor
public class ItemResponse {

    int id;
    String name;
    int price;
}

以下はHTTPieを使ってGETリクエストを投げた実行例です。

$  http :8080/items/100 name==test  

# レスポンス
{
    "id": 100,
    "name": "test",
    "price": 100
}

HTTPieについては以下の記事にまとめています。

POSTリクエストの処理

POSTリクエストを処理するためにはメソッドに@PostMappingアノテーションを付与します。POSTリクエストで投げられるJSONを処理するためにはJSONに対応するクラスを定義し、@RequestBodyアノテーションを付与した引数とします。

何かを保存するAPIの場合レスポンスステータスコードに201(Created)を返したい場合があります。その場合はメソッドに@ResponseStatusアノテーションを付与することでレスポンスステータスコードを指定することができます。

レスポンスステータスコードを201としたい場合は@ResponseStatus(HttpStatus.CREATED)をメソッドに付与します。

以下の例ではPOSTリクエストで受け取ったJSONから新たなインスタンスを生成して返しています。

// インポートは省略

@RestController
public class ItemController {

    @ResponseStatus(HttpStatus.CREATED)
    @PostMapping("items")
    public ItemResponse save(@RequestBody ItemRequest itemRequest) {

        return new ItemResponse(itemRequest.getId(), itemRequest.getName(), itemRequest.getPrice());
    }
}

リクエストを受け取るクラスは以下のように定義しています。Lombokを使用してゲッター、セッター、コンストラクタを生成しています。

// インポートは省略

@Data
@NoArgsConstructor
@AllArgsConstructor
public class ItemRequest {

    private int id;
    private String name;
    private int price;
}

レスポンス用のクラスはGETリクエストのレスポンスに使用したItemResponseクラスと同じです。