Spring Bootのリクエストパラメーターの取得方法のメモ。
ControllerやRestControllerのメソッドの引数に@RequestParamアノテーションを付けることで、HTTPリクエストのパラメーター(URIの末尾の「?」以降のやつ)を受け取ることが出来る。
import org.springframework.web.bind.annotation.RequestParam;
Spring Boot 1.5.6の例。
import java.util.Collections; import java.util.List; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController;
@RestController
public class ApiController {
@RequestMapping(path = "/api/example")
public String param(@RequestParam(name = "zzz", required = false) List<String> zzz) {
if (zzz == null) {
zzz = Collections.emptyList();
}
return zzz.toString();
}
}
↓
$ curl 'http://127.0.0.1:8080/api/example' [] $ curl 'http://127.0.0.1:8080/api/example?zzz=111' [111] $ curl 'http://127.0.0.1:8080/api/example?zzz=111&zzz=222' [111, 222]
コーディング | URIのパラメーター部 | 説明 | ||
---|---|---|---|---|
? |
?zzz=111 |
?zzz=111&zzz=222 |
||
@RequestParam("zzz") String zzz |
(例外が発生する) | 111 |
111,222 |
同名パラメーターが複数ある場合、 カンマで区切られたひとつの文字列として入ってくる。 |
@RequestParam(name = "zzz", required = false) |
null |
111 |
111,222 |
|
@RequestParam("zzz") List<String> zzz |
(例外が発生する) | [111] |
[111, 222] |
引数をListにすると、 同名パラメーターが複数あっても別々に取得できる。 |
@RequestParam(name = "zzz", required = false) List<String> zzz |
null |
[111] |
[111, 222] |
|
@RequestParam Map<String, String> params |
{} |
{zzz=111} |
{zzz=111} |
引数をMapにすると、パラメーターがまとめて取れる。 ただし同名パラメーターが複数ある場合、 先頭の値のみが入る。 |
// org.springframework.util.MultiValueMap |
{} |
{zzz=[111]} |
{zzz=[111, 222]} |
MultiValueMapはMap<K, List<V>> のラッパー。MultiValueMapを使うと、 同名パラメーターが複数あっても別々に取得できる。 |
@RequestParamアノテーションにパラメーター名を指定してrequiredを指定しない(requiredのデフォルトはtrue、すなわちパラメーターが必須)場合、
実際のHTTPリクエストにそのパラメーターが無いと、例外が発生する。
クライアントには、デフォルトでは以下のようなレスポンスが変える。
{"timestamp":1504180846457,
"status":400,
"error":"Bad Request",
"exception":"org.springframework.web.bind.MissingServletRequestParameterException",
"message":"Required String parameter 'zzz' is not present",
"path":"/api/example"}