| 参数名 | 核心作用 | 通俗理解 |
|---|---|---|
value/path |
指定匹配的 URL 路径 | 告诉 Spring:"这个方法对应哪个地址" |
method |
指定匹配的 HTTP 请求方式(GET/POST 等) | 告诉 Spring:"这个方法只处理哪种请求" |
params |
指定请求必须包含 / 不能包含某些参数 | 告诉 Spring:"只有带这些参数的请求才处理" |
headers |
指定请求必须包含 / 不能包含某些请求头 | 告诉 Spring:"只有带这些头的请求才处理" |
consumes |
指定请求体的媒体类型(Content-Type) | 告诉 Spring:"只接收这种格式的请求体" |
produces |
指定响应体的媒体类型(Accept) | 告诉 Spring:"只返回这种格式的响应" |
1.value /path(指定 URL 路径)
这是最常用的参数,两个参数完全等价 (path 是 Spring 4.3 后新增的,更语义化),用来绑定请求的 URL 路径。
用法示例
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
// 类级别:给所有方法加基础路径 /book
@RequestMapping("/book")
public class BookController {
// 方式1:只用 value(最常见)
@RequestMapping(value = "/detail")
public String bookDetail() {
return "匹配路径:/book/detail";
}
// 方式2:只用 path(和 value 效果一样)
@RequestMapping(path = "/list")
public String bookList() {
return "匹配路径:/book/list";
}
// 方式3:省略参数名(只有一个路径参数时,可简写)
@RequestMapping("/search")
public String bookSearch() {
return "匹配路径:/book/search";
}
// 方式4:匹配多个路径(数组形式)
@RequestMapping(value = {"/info", "/desc"})
public String bookInfo() {
return "匹配路径:/book/info 或 /book/desc";
}
}
核心要点:
- 类级别 + 方法级别的路径会自动拼接(比如上面的
/book+/detail=/book/detail); - 支持数组形式,一个方法可以匹配多个 URL 路径。
2. method(指定 HTTP 请求方式)
限定当前方法只处理某种 / 某些 HTTP 请求方式(GET/POST/PUT/DELETE 等),如果不指定,默认允许所有请求方式(不推荐)。
用法示例
import org.springframework.web.bind.annotation.RequestMethod;
@RestController
@RequestMapping("/user")
public class UserController {
// 只处理 GET 请求
@RequestMapping(value = "/detail", method = RequestMethod.GET)
public String getUser() {
return "仅 GET 请求能访问 /user/detail";
}
// 只处理 POST 请求
@RequestMapping(value = "/add", method = RequestMethod.POST)
public String addUser() {
return "仅 POST 请求能访问 /user/add";
}
// 处理多种请求方式(GET + POST)
@RequestMapping(value = "/edit", method = {RequestMethod.GET, RequestMethod.POST})
public String editUser() {
return "GET 或 POST 请求都能访问 /user/edit";
}
}
核心要点:
@GetMapping就是method=RequestMethod.GET的简化版,@PostMapping同理;- 如果请求方式不匹配,Spring 会返回 405 错误(Method Not Allowed)。
3. params(指定请求参数)
限定请求必须包含 / 不包含某些参数,才能匹配到这个方法,常用于 "同一个路径,不同参数走不同方法" 的场景。
用法示例(支持 4 种表达式)
@RestController
@RequestMapping("/goods")
public class GoodsController {
// 1. 必须包含参数 id(比如 /goods/detail?id=1)
@RequestMapping(value = "/detail", params = "id")
public String detailWithId() {
return "请求必须带 id 参数";
}
// 2. 必须不包含参数 type(比如 /goods/list 不能带 type)
@RequestMapping(value = "/list", params = "!type")
public String listWithoutType() {
return "请求不能带 type 参数";
}
// 3. 参数 id 必须等于 100(比如 /goods/info?id=100)
@RequestMapping(value = "/info", params = "id=100")
public String infoWithId100() {
return "id 参数必须等于 100";
}
// 4. 参数 status 必须不等于 0(比如 /goods/state?status=1)
@RequestMapping(value = "/state", params = "status!=0")
public String stateWithStatusNot0() {
return "status 参数不能等于 0";
}
// 5. 组合条件:必须包含 id,且不能包含 type
@RequestMapping(value = "/query", params = {"id", "!type"})
public String query() {
return "必须带 id,不能带 type";
}
}
4. headers(指定请求头)
限定请求必须包含 / 不包含某些请求头,常用于区分不同客户端、不同版本的请求。
用法示例
@RestController
@RequestMapping("/api")
public class ApiController {
// 1. 必须包含请求头:token(比如请求头里有 token=xxx)
@RequestMapping(value = "/v1/user", headers = "token")
public String v1User() {
return "请求头必须带 token";
}
// 2. 请求头 Content-Type 必须是 application/json
@RequestMapping(value = "/v2/user", headers = "Content-Type=application/json")
public String v2User() {
return "请求体必须是 JSON 格式";
}
// 3. 组合条件:必须带 token,且不能带 version=1.0
@RequestMapping(value = "/v3/user", headers = {"token", "version!=1.0"})
public String v3User() {
return "带 token,且 version 不是 1.0";
}
}
5. consumes(指定请求体格式)
限定请求的 Content-Type(请求体媒体类型),比如只接收 JSON 格式的请求体,不接收表单格式。
用法示例
@RestController
@RequestMapping("/order")
public class OrderController {
// 只接收 JSON 格式的请求体(Content-Type: application/json)
@RequestMapping(value = "/create", method = RequestMethod.POST, consumes = "application/json")
public String createOrder() {
return "仅接收 JSON 格式的 POST 请求";
}
// 只接收表单格式的请求体(Content-Type: application/x-www-form-urlencoded)
@RequestMapping(value = "/submit", method = RequestMethod.POST, consumes = "application/x-www-form-urlencoded")
public String submitOrder() {
return "仅接收表单格式的 POST 请求";
}
// 接收多种格式(JSON 或表单)
@RequestMapping(value = "/save", method = RequestMethod.POST, consumes = {"application/json", "application/x-www-form-urlencoded"})
public String saveOrder() {
return "接收 JSON 或表单格式的 POST 请求";
}
}
6. produces(指定响应体格式)
限定响应的媒体类型,同时会匹配请求头的 Accept 字段,比如只返回 JSON 格式,不返回 XML。
用法示例
@RestController
@RequestMapping("/data")
public class DataController {
// 只返回 JSON 格式(响应头 Content-Type: application/json)
@RequestMapping(value = "/json", produces = "application/json")
public String returnJson() {
return "{\"name\":\"张三\",\"age\":20}";
}
// 只返回 XML 格式(响应头 Content-Type: application/xml)
@RequestMapping(value = "/xml", produces = "application/xml")
public String returnXml() {
return "<user><name>张三</name><age>20</age></user>";
}
// 根据请求头 Accept 自动匹配(比如 Accept:application/json 返 JSON,Accept:application/xml 返 XML)
@RequestMapping(value = "/auto", produces = {"application/json", "application/xml"})
public String returnAuto() {
return "根据请求头返回对应格式";
}
}