@RequestMapping的参数

参数名 核心作用 通俗理解
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 "根据请求头返回对应格式";
    }
}
相关推荐
青云计划6 小时前
知光项目知文发布模块
java·后端·spring·mybatis
赶路人儿6 小时前
Jsoniter(java版本)使用介绍
java·开发语言
探路者继续奋斗7 小时前
IDD意图驱动开发之意图规格说明书
java·规格说明书·开发规范·意图驱动开发·idd
消失的旧时光-19438 小时前
第十九课:为什么要引入消息队列?——异步系统设计思想
java·开发语言
yeyeye1118 小时前
Spring Cloud Data Flow 简介
后端·spring·spring cloud
A懿轩A8 小时前
【Java 基础编程】Java 面向对象入门:类与对象、构造器、this 关键字,小白也能写 OOP
java·开发语言
乐观勇敢坚强的老彭8 小时前
c++寒假营day03
java·开发语言·c++
biubiubiu07068 小时前
谷歌浏览器无法访问localhost:8080
java
+VX:Fegn08959 小时前
计算机毕业设计|基于springboot + vue鲜花商城系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
大黄说说9 小时前
新手选语言不再纠结:Java、Python、Go、JavaScript 四大热门语言全景对比与学习路线建议
java·python·golang