こんにちは!今回は、Spring Frameworkでクエリパラメータを取得するために使用されるアノテーション、@RequestParam
について詳しく解説します。@RequestParam
を使えば、URLに含まれるパラメータを簡単に取得し、サーバー側でリクエスト処理を行うことができます。
@RequestParamとは?
@RequestParam
とは、
「HTTPリクエストのURLに含まれるクエリパラメータをメソッドの引数として取得する」
のことができるアノテーションです。
例えば、URLを見たときに、「example.com?id=3」のように「?」が入っている場合があります。
この場合、idという名前のフィールドに3という値を入れて画面を表示しているのです。
これをクエリパラメータといい、それを受け取るために、@RequestParam
を使用します。
基本的な使い方
まず、簡単なコード例を見てみましょう。以下は、クエリパラメータとして渡されたユーザー名を取得し、それを使って挨拶メッセージを生成する例です。
サーバー側のコード
@GetMapping("/greet")
public String greetUser(@RequestParam String name) {
return "Hello, " + name + "!";
}
このコードでは、@RequestParam
アノテーションを使ってname
パラメータを取得し、メソッド内で利用しています。クエリパラメータname
がURLに含まれている場合、その値がgreetUser
メソッドのname
引数に渡されます。
クライアント側のリクエスト
GET http://localhost:8080/greet?name=John
上記のリクエストを送信すると、レスポンスとして "Hello, John!"
が返されます。
@RequestParamのオプション
@RequestParam
には、オプションで指定できる属性がいくつかあります。それぞれの使い方を詳しく見ていきましょう。
1. value属性
value
属性は、リクエストパラメータの名前を指定するために使用されます。デフォルトでは、引数名と同じ名前のパラメータが期待されますが、value
属性を使うことで異なる名前のパラメータをマッピングすることができます。
@GetMapping("/search")
public String searchProduct(@RequestParam(value = "query") String productName) {
return "Searching for: " + productName;
}
この場合、クエリパラメータとしてquery
を指定すると、メソッドのproductName
引数に値が渡されます。
GET http://localhost:8080/search?query=laptop
結果: "Searching for: laptop"
が返されます。
2. required属性
required
属性は、パラメータが必須かどうかを指定するために使用します。デフォルトでは、true
に設定されているため、パラメータが渡されないとエラーが発生します。しかし、required = false
に設定することで、パラメータが渡されなかった場合でもエラーにならず、代わりにデフォルトの処理を行うことができます。
@GetMapping("/greet")
public String greetUser(@RequestParam(value = "name", required = false) String name) {
if (name == null) {
return "Hello, Guest!";
}
return "Hello, " + name + "!";
}
name
パラメータが提供されない場合は、「Guest」として扱われます。
GET http://localhost:8080/greet
結果: "Hello, Guest!"
3. defaultValue属性
defaultValue
属性は、パラメータが提供されなかった場合に使用されるデフォルトの値を設定するために使用します。これにより、null
チェックを省略でき、簡潔なコードを書くことができます。
@GetMapping("/greet")
public String greetUser(@RequestParam(value = "name", defaultValue = "Guest") String name) {
return "Hello, " + name + "!";
}
この場合、name
パラメータが無い場合でも、自動的に「Guest」というデフォルトの値が使用されます。
GET http://localhost:8080/greet
結果: "Hello, Guest!"
複数のクエリパラメータの取得
@RequestParam
を使って複数のパラメータを取得することも可能です。たとえば、ページネーションのような場面で、ページ番号や表示件数をクエリパラメータとして渡すことが一般的です。
@GetMapping("/products")
public String getProducts(@RequestParam(value = "page", defaultValue = "1") int page,
@RequestParam(value = "size", defaultValue = "10") int size) {
return "Displaying page " + page + " with " + size + " products per page.";
}
この例では、page
とsize
の2つのクエリパラメータを取得し、それに基づいて出力メッセージを生成しています。
GET http://localhost:8080/products?page=2&size=5
結果: "Displaying page 2 with 5 products per page."
Listや配列としてクエリパラメータを取得する
複数の同じ名前のパラメータをリクエストに含める場合、@RequestParam
を使ってList
や配列として値を取得することができます。
@GetMapping("/filter")
public String filterProducts(@RequestParam List<String> categories) {
return "Filtering by categories: " + String.join(", ", categories);
}
クライアントが複数のカテゴリーをフィルタリングしたい場合、以下のようにリクエストを送信します。
GET http://localhost:8080/filter?categories=electronics&categories=books
結果: "Filtering by categories: electronics, books"
@RequestParamを使った応用例
ここでは、@RequestParam
の応用的な使い方をいくつか紹介します。
1. オブジェクトにマッピング
クエリパラメータが複数あり、それらを一つのオブジェクトにマッピングしたい場合、@ModelAttribute
アノテーションを使うことができます。
@GetMapping("/search")
public String searchProducts(@ModelAttribute ProductFilter filter) {
return "Filtering by: " + filter.toString();
}
この例では、ProductFilter
というクラスにクエリパラメータが自動的にバインドされます。
2. パラメータのバリデーション
@RequestParam
を使ってバリデーションを行うことも可能です。たとえば、@Valid
アノテーションとカスタムバリデータを組み合わせて入力を検証できます。
@GetMapping("/register")
public String registerUser(@RequestParam @NotEmpty String email,
@RequestParam @Size(min = 6) String password) {
return "User registered with email: " + email;
}
このコードでは、email
が空でないこと、password
が6文字以上であることを検証しています。検証に失敗すると、例外がスローされます。
@RequestParamの引数
@RequestParam
では、いくつかの引数を指定することができます。これにより、リクエストのパラメータを柔軟に扱うことが可能です。
1. value属性
value
属性は、対応するリクエストパラメータの名前を指定します。
2. required属性
required
属性で、パラメータが必須かどうかを指定します。
3. defaultValue属性
defaultValue
属性は、パラメータが存在しない場合に使用されるデフォルト値を設定します。
まとめ
@RequestParam
は、クエリパラメータを取得してリクエスト処理を行う上で非常に便利なアノテーションです。クエリパラメータが必須であったり、デフォルト値を設定したりするなど、柔軟なオプションも用意されています。今回の解説を参考にして、ぜひ@RequestParam
を活用してみてください!
もっと詳しく知りたい方は、Spring公式ドキュメントを見てみてくださいね。
他のMappingアノテーションについて知りたい方はこちらもどうぞ!↓↓↓↓