路径参数-Springboot总结

在 Spring Boot 中,参数注解用于将 HTTP 请求中的数据(如路径变量、请求参数、请求体等)绑定到控制器方法的参数上,简化了参数获取的流程。

1. @PathVariable

  • 作用:获取 URL 路径中的变量(RESTful 风格路径参数)。
  • 场景:用于获取 URL 中动态部分的值,如 /users/{id} 中的 id
@RestController
@RequestMapping("/users")
public class UserController {
    
    // 获取路径中的id参数
    @GetMapping("/{id}")
    public String getUserById(@PathVariable Long id) {
        return "获取用户ID:" + id;
    }
    
    // 多路径参数(名称不一致时需指定value)
    @GetMapping("/{userId}/orders/{orderId}")
    public String getOrder(
            @PathVariable("userId") Long uId,  // 路径变量userId绑定到uId
            @PathVariable Long orderId         // 名称一致可省略value
    ) {
        return "用户ID:" + uId + ",订单ID:" + orderId;
    }
}

2. @RequestParam

  • 作用:获取 URL 中 ? 后的请求参数(查询参数)。
  • 场景:如 /search?keyword=java&page=1 中的 keyword 和 page
@RestController
@RequestMapping("/search")
public class SearchController {
    
    // 基本使用
    @GetMapping
    public String search(
            @RequestParam String keyword,  // 必传参数,不传会报错
            @RequestParam(defaultValue = "1") int page,  // 可选参数,默认值1
            @RequestParam(required = false) Integer size  // 可选参数,可传null
    ) {
        return "关键词:" + keyword + ",页码:" + page + ",每页大小:" + size;
    }
}

@RequestBody

  • 作用:获取 HTTP 请求体中的数据(通常是 JSON/XML 格式),并绑定到 Java 对象。
  • 场景:POST/PUT 请求中提交复杂数据(如表单提交、JSON 数据)。
// 定义实体类
public class User {
    private Long id;
    private String name;
    private Integer age;
    // 省略getter、setter、构造方法
}

@RestController
@RequestMapping("/users")
public class UserController {
    
    // 接收JSON请求体并转换为User对象
    @PostMapping
    public String createUser(@RequestBody User user) {
        return "创建用户:" + user.getName() + ",年龄:" + user.getAge();
    }
}

请求示例(JSON 格式):

// POST /users 的请求体
{
  "id": 1,
  "name": "张三",
  "age": 20
}

@RequestHeader

  • 作用:获取 HTTP 请求头中的信息。
  • 场景:获取 Content-TypeToken 等请求头参数。
@RestController
public class HeaderController {
    
    @GetMapping("/header")
    public String getHeader(
            @RequestHeader("Content-Type") String contentType,
            @RequestHeader(value = "Token", required = false) String token
    ) {
        return "Content-Type:" + contentType + ",Token:" + token;
    }
}

 @CookieValue

  • 作用:获取请求中的 Cookie 值。
  • 场景:需要从 Cookie 中获取会话信息等场景。
@RestController
public class CookieController {
    
    @GetMapping("/cookie")
    public String getCookie(@CookieValue(value = "SESSIONID", required = false) String sessionId) {
        return "会话ID:" + sessionId;
    }
}

 @ModelAttribute

  • 作用:将请求参数(表单数据)绑定到 Java 对象(支持嵌套对象)。
  • 场景:表单提交时,自动封装参数到实体类。
// 实体类User(同上)
@RestController
@RequestMapping("/form")
public class FormController {
    
    // 表单参数绑定到User对象
    @PostMapping("/user")
    public String submitForm(@ModelAttribute User user) {
        return "提交的用户:" + user.getName() + ",年龄:" + user.getAge();
    }
}

表单提交示例

<form action="/form/user" method="post">
    <input name="name" value="张三">
    <input name="age" value="20">
    <button type="submit">提交</button>
</form>

@MatrixVariable

  • 作用:获取 URL 中的矩阵变量(用 ; 分隔的参数)。
  • 注意:默认禁用,需在配置类中开启。
// 开启矩阵变量(配置类)
@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        configurer.setRemoveSemicolonContent(false); // 不移除分号后的内容
    }
}

// 使用示例
@RestController
public class MatrixController {
    @GetMapping("/cars/{path}")
    public String getCars(
            @MatrixVariable("color") String color,  // 获取color矩阵变量
            @MatrixVariable("brand") List<String> brands,  // 多个值
            @PathVariable String path
    ) {
        return "路径:" + path + ",颜色:" + color + ",品牌:" + brands;
    }
}

请求示例
访问 /cars/abc;color=red;brand=bmw;brand=tesla
返回:路径:abc,颜色:red,品牌:[bmw, tesla]

总结

Spring Boot 的参数注解简化了请求数据的获取,核心注解包括:

  • 路径参数:@PathVariable
  • 查询参数:@RequestParam
  • 请求体:@RequestBody
  • 请求头:@RequestHeader
  • Cookie:@CookieValue
  • 表单绑定:@ModelAttribute

根据请求类型(GET/POST 等)和数据位置(路径 / 请求体 / 头)选择合适的注解,可大幅提升开发效率。

特别注意@PathVariable 是 Spring Boot 中用于用于获取 URL 路径中动态参数的注解,主要用于 RESTful 风格的接口设计,通过它可以轻松获取 URL 路径中的变量值。

核心特点

  • 作用:从 URL 路径中提取动态参数(如 /users/{id} 中的 id
  • 适用场景:RESTful API 中获取资源标识(ID、名称等)
  • 绑定方式:通过参数名与路径变量名匹配自动绑定

基本使用方法

1. 简单示例(名称一致)

当方法参数名与 URL 路径中的变量名一致时,可以直接使用:

@RestController
@RequestMapping("/users")
public class UserController {
    // URL 路径:/users/123
    @GetMapping("/{id}")
    public String getUser(@PathVariable Long id) {
        // id 会自动获取路径中的 123
        return "获取用户ID:" + id; 
    }
}

访问 http://localhost:8080/users/123,会返回 获取用户ID:123

2. 名称不一致时指定绑定关系

如果方法参数名与路径变量名不同,需要通过 value 属性指定对应关系

@GetMapping("/{userId}/orders/{orderId}")
public String getOrder(
    @PathVariable("userId") Long uId,  // 路径变量 userId 绑定到 uId
    @PathVariable Long orderId         // 名称一致,直接绑定
) {
    return "用户ID:" + uId + ",订单ID:" + orderId;
}

访问 http://localhost:8080/users/456/orders/789,会返回 用户ID:456,订单ID:789

3. 可选参数(允许为 null)

默认情况下,@PathVariable 修饰的参数是必传的,如果路径中没有该变量,会报错。
若需要设置为可选参数,可添加 required = false(但需确保路径设计支持可选):

// 支持 /users 和 /users/123 两种路径
@GetMapping({"/", "/{id}"})
public String getUserInfo(@PathVariable(required = false) Long id) {
    if (id == null) {
        return "获取所有用户";
    } else {
        return "获取用户ID:" + id;
    }
}

4. 接收多个参数并处理

可以同时获取多个路径变量,并进行业务处理:

@GetMapping("/products/{category}/{id}")
public String getProduct(
    @PathVariable String category,
    @PathVariable Long id
) {
    return "商品分类:" + category + ",商品ID:" + id;
}

访问 http://localhost:8080/products/electronics/100,返回 商品分类:electronics,商品ID:100

注意事项

  1. 路径变量名区分大小写:URL 中的 {UserId} 和代码中的 @PathVariable("userId") 会匹配失败。
  2. 参数类型自动转换:Spring 会自动将路径中的字符串转换为方法参数的类型(如 String → Long),转换失败会抛 TypeMismatchException
  3. 配合 @RequestMapping 使用:通常与 @GetMapping@PostMapping 等注解配合,定义包含变量的路径。

总结

@PathVariable 是 RESTful 接口开发中的核心注解,通过它可以优雅地从 URL 路径中提取动态参数,使代码更简洁、语义更清晰。使用时需注意参数名匹配和类型转换问题,确保路径设计与参数接收逻辑一致。

核心区别

维度@PathVariable@RequestParam
数据位置URL 路径中(如 /users/{id} 中的 idURL 问号后的查询参数(如 ?page=1&size=10
适用场景RESTful 风格的路径参数(资源标识)过滤、分页、搜索等可选参数
URL 格式/资源/{变量1}/{变量2}/资源?参数1=值1&参数2=值2
是否必传默认必传(可通过 required=false 设为可选)默认必传(可通过 required=false 设为可选)

代码示例对比

1. @PathVariable 示例(路径参数)

用于获取 URL 路径中的动态变量,通常是资源的唯一标识(如 ID):

@RestController
@RequestMapping("/users")
public class UserController {
    // 访问路径:/users/123
    @GetMapping("/{id}")
    public String getUser(@PathVariable Long id) {
        return "获取用户ID:" + id; // id = 123
    }
}

2. @RequestParam 示例(查询参数)

用于获取 URL 中 ? 后的键值对参数,通常是过滤或分页条件:

@RestController
@RequestMapping("/users")
public class UserController {
    // 访问路径:/users?page=1&size=10
    @GetMapping
    public String getUsers(
            @RequestParam int page,
            @RequestParam int size
    ) {
        return "第" + page + "页,每页" + size + "条"; // page=1, size=10
    }
}

其他关键区别

  1. 参数格式
    • @PathVariable 的参数是 URL 路径的一部分,必须符合路径语法(不能包含 ?&= 等特殊字符)。
    • @RequestParam 的参数是键值对形式,多个参数用 & 分隔,支持更灵活的取值。
  2. 使用场景
    • 当参数是资源的唯一标识(如 ID、名称)时,用 @PathVariable(符合 RESTful 设计)。
    • 当参数是可选的过滤条件(如搜索关键词、分页参数)时,用 @RequestParam
  3. 默认值处理
    • 两者都可通过 defaultValue 设置默认值,但 @PathVariable 需要路径支持(如 /users/{id:.*}? 允许空值)。
// @RequestParam 设置默认值
@GetMapping("/list")
public String list(@RequestParam(defaultValue = "1") int page) { ... }

// @PathVariable 设置默认值(需路径支持)
@GetMapping({"/info", "/info/{id}"})
public String info(@PathVariable(required = false, defaultValue = "0") Long id) { ... }

博客内容均系原创,未经允许严禁转载!
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇