1. 概要

このクイックチュートリアルでは、Springの@RequestParamアノテーションと@PathVariableアノテーションの違いについて説明します。

@RequestParam@PathVariableはどちらも、リクエストURIから値を抽出するために使用できますが、少し異なります。

2. クエリパラメータとURIパス

@RequestParamsはクエリ文字列から値を抽出しますが、@PathVariablesはURIパスから値を抽出します。

@GetMapping("/foos/{id}")
@ResponseBody
public String getFooById(@PathVariable String id) {
    return "ID: " + id;
}

次に、パスに基づいてマップできます。

http://localhost:8080/spring-mvc-basics/foos/abc
----
ID: abc

@RequestParam の場合、次のようになります。

@GetMapping("/foos")
@ResponseBody
public String getFooByIdUsingQueryParam(@RequestParam String id) {
    return "ID: " + id;
}

これにより、同じ応答が得られますが、URIが異なります。

http://localhost:8080/spring-mvc-basics/foos?id=abc
----
ID: abc

3. エンコードされた値と正確な値

@PathVariable はURIパスから値を抽出しているため、エンコードされていません。 一方、@RequestParamはエンコードされます。

前の例を使用すると、 ab +cはそのまま返されます。

http://localhost:8080/spring-mvc-basics/foos/ab+c
----
ID: ab+c

ただし、@ RequestParamリクエストの場合、パラメーターはURLデコードされます

http://localhost:8080/spring-mvc-basics/foos?id=ab+c
----
ID: ab c

4. オプション値

@RequestParam@PathVariableはどちらもオプションです。

Spring4.3.3以降のrequired属性を使用して、@PathVariableをオプションにすることができます。

@GetMapping({"/myfoos/optional", "/myfoos/optional/{id}"})
@ResponseBody
public String getFooByOptionalId(@PathVariable(required = false) String id){
    return "ID: " + id;
}

次に、次のいずれかを実行できます。

http://localhost:8080/spring-mvc-basics/myfoos/optional/abc
----
ID: abc

また:

http://localhost:8080/spring-mvc-basics/myfoos/optional
----
ID: null

@RequestParam の場合、required属性を使用することもできます。

@PathVariableをオプションにするときは、パスの競合を避けるために注意する必要があることに注意してください。

5. 結論

この記事では、@RequestParam@PathVariableの違いを学びました。

例の完全なソースコードは、GitHubにあります。