@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 "根据请求头返回对应格式";
    }
}
相关推荐
leikooo10 小时前
用餐厅和盘子理解栈和堆
java·数据结构·链表·rust
Ivanqhz11 小时前
激活函数在 Transformer 中的作用及各种变体简述
java·linux·数据库·人工智能·深度学习
沙漠之主11 小时前
C++编程教学设计资料:从入门到实战的完整课程方案
java·前端·c++
FPGA小徐11 小时前
PA1 基础设施(2)深度解析:NEMU 中 ITRACE、MTRACE、FTRACE、IRINGBUF、ETRACE、DIFFTEST 全解析
java·服务器·网络
YOLO数据集集合12 小时前
EvoAgent:面向PR研发治理的自进化Multi-Agent Harness系统
java·开发语言·目标检测·agent·自进化
知行EDI12 小时前
知行之桥 MaBang 端口使用指南——Create Order 订单创建篇
java·服务器·数据库
笑鸿的学习笔记12 小时前
C++笔记之大块顺序写
java·c++·笔记
打工仔折腾 AI12 小时前
从 Demo 到生产级 Agent:8 个关键设计机制与 Python 实现拆解
java·jvm·人工智能·后端·python·langchain·ai agent 实战
殷色玫瑰13 小时前
C/C++ 内存管理详解:从内存分布到 new/delete 底层原理
java·linux·c语言·c++
code_slave(码畜)14 小时前
微服务架构落地:基础服务 —— 报表服务(中篇:元数据、查询引擎、缓存与权限落地)
spring boot·spring cloud·缓存·微服务·架构