S-JIS[2017-08-31] 変更履歴

Spring Bootリクエストパラーメーター

Spring Bootのリクエストパラメーターの取得方法のメモ。


概要

ControllerRestControllerのメソッドの引数に@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
@RequestParam MultiValueMap<String, String> params
{} {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"}


Spring Bootへ戻る / Spring Frameworkへ戻る / 技術メモへ戻る
メールの送信先:ひしだま