【Spring】Spring MVCでのWeb APIの作り方まとめ
コントローラの作成
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クラスと同じです。