はじめに
Webアプリ開発をしている際に、クエリパラメータの受け取り方で質問を受けました。その際に調べて色々分かったことがあったので記事にしようと思います。
クエリパラメータの受け取り方
- クエリパラメータの受け取り方には
@RequestParam
や@ModelAttribute
などいくつか種類があるため順番に解説しようと思います
@RequestParam
まず1つ目に@RequestParam
です。これが1番デフォルトで分かりやすいかなと思います。
クエリパラメータを受け取るのはControllerクラスだと思うので例に出して解説します。
- クエリパラメータが1つの場合
@RestController
class ProductController{
/**
* 商品一覧取得の処理
*
* @param 検索ワード
* @return 検索結果
/
public List<Product> getAll (@RequestParam String query) {
//〜コントローラーの処理〜
}
}
以上のように、メソッドの引数に@RequestParam
で指定することで
GET http://localhost:8080/products?query=キーボード
クエリパラメータ
として指定されたキーボード
が引数の変数query
に入る形となります。
- クエリパラメータが複数の場合
複数の場合にも基本的に書き方は同じなのですが、少しだけ書き加えることがあるのでサンプルコードを見てみてください
@RestController
class ProductController{
/**
* 商品一覧取得の処理
*
* @param 検索ワード
* @param 色の検索ワード
* @return 検索結果
/
public List<Product> getAll (@RequestParam(value = "query") String query,
@RequestParam(value = "color") String color) {
//〜コントローラーの処理〜
}
}
以上のように2つクエリパラメータがあった場合、GET http://localhost:8080/products?query=キーボード&color=赤
⇦URLのクエリパラメータをどの変数に入れれば良いか判断してくれないので明示的に書いてあげる必要があります。そのときにvalue属性
を使い指定していきます。
@ModelAttribute
次に@ModelAttribute
を使うパターンです。どのようなときに使うかですが、ずばり「オブジェクトで受け取るとき」です。言葉よりコードを見たほうが早いと思うのでサンプルコードを見てみてください。
class Product{
//商品名
private String query;
//色
private String color;
//以下getter/setter
}
@RestController
class ProductController{
/**
* 商品一覧取得の処理
*
* @param 検索ワード
* @return 検索結果
/
public List<Product> getAll (@ModelAttribute Product product) {
//〜コントローラーの処理〜
}
}
GET http://localhost:8080/products?query=キーボード&color=赤
以上のように1つ目のクラスで商品のオブジェクトを用意します。2つ目のクラスで引数をオブジェクトに変えました。これでクエリパラメータが複数あっても、オブジェクトの変数名とURLでの名前が一致していれば、入れることができます。注意点は、オブジェクトの変数名とURLでの名前が一致していないといけないことです。
@ModelAttribute
をつけないパターン
@RestController
class ProductController{
/**
* 商品一覧取得の処理
*
* @param 検索ワード
* @return 検索結果
/
public List<Product> getAll (Product product) {
//〜コントローラーの処理〜
}
}
以上のように、オブジェクトで受け取る場合、@ModelAttribute
を省略することができます。
ここで、省略できるなら書く必要なくなるじゃん!と思うかもしれません。たしかに付けなくても動くので、省略しても基本的に問題はないです。ですが、付けたほうが挙動の確実性を保証してくれますし、可読性も高いです。公式でも付けることが推奨されているので、思わぬ不具合を起こさないためにも付けることをおすすめします。省略できることも知識としては覚えておくと良いと思います。
まとめ
これまでの通り、クエリパラメータを受け取る方法はいくつか種類があり、オブジェクトにするかしないかで大きく変わります。この記事で使い方の違いをはっきりと理解してくれたら嬉しいです。