SpringBoot接收参数的几种常用方式

目录

  • [1、路径变量(Path Variables)](#1、路径变量(Path Variables))
    • 1.1、接口定义
    • [1.2 、APIPost 测试](#1.2 、APIPost 测试)
    • [1.3 、详细解释](#1.3 、详细解释)
    • [1.4 、不写括号里的 id 的影响](#1.4 、不写括号里的 id 的影响)
      • [1.4.1、 情况1](#1.4.1、 情况1)
      • [1.4.2、 情况2](#1.4.2、 情况2)
      • [1.4.3、 情况3(错误情况)](#1.4.3、 情况3(错误情况))
  • [2、请求参数(Request Parameters)](#2、请求参数(Request Parameters))
  • [3、请求体(Request Body)](#3、请求体(Request Body))
  • [4、 表单数据(Form Data)](#4、 表单数据(Form Data))
  • 5、参考链接

1、路径变量(Path Variables)

1.1、接口定义

java 复制代码
@RestController
@RequestMapping("/api")
public class ExampleController {

    @GetMapping("/users/{id}")
    public String getUserById(@PathVariable("id") Long id) {
        return "User ID: " + id;
    }
}

1.2 、APIPost 测试

请求 URL: http://localhost:8080/api/users/123

请求方法: GET

结果:123

1.3 、详细解释

在 Spring Boot 中,@PathVariable 注解用于提取 URL 中的路径变量。路径变量是在 URL 中占位符的位置,通常用于获取动态数据(例如资源 ID)。

解释

@PathVariable("id"):"id" 是 URL 模板中路径变量的名称。在这个例子中,@PathVariable 注解告诉 Spring 框架,方法的 id 参数应该绑定到 URL 中的 {id} 部分。

示例

java 复制代码
@RestController
@RequestMapping("/api")
public class ExampleController {

    @GetMapping("/users/{id}")
    public String getUserById(@PathVariable("id") Long id) {
        return "User ID: " + id;
    }
}

在这个例子中:

URL 模板:/users/{id},其中 {id} 是路径变量。

方法参数:@PathVariable("id") Long id,这表示方法的 id 参数将绑定到 URL 中的 {id} 部分。

1.4 、不写括号里的 id 的影响

1.4.1、 情况1

如果你不写括号里的 id,Spring Boot 会依赖于默认行为。默认情况下,@PathVariable 会使用方法参数的名字作为路径变量的名字。如果方法参数名与路径变量名匹配,代码仍然能正常工作。例如:

java 复制代码
@GetMapping("/users/{id}")
public String getUserById(@PathVariable Long id) {
    return "User ID: " + id;
}

在这个例子中:

路径变量的名字和方法参数的名字一致。

Spring Boot 会自动将 URL 中的 {id} 绑定到方法的 id 参数。

1.4.2、 情况2

java 复制代码
@GetMapping("/users/{userId}")
public String getUserById(@PathVariable(userId) Long id) {
    return "User ID: " + id;
}

这样也是没问题的。

1.4.3、 情况3(错误情况)

参数名不匹配:如果路径变量的名字和方法参数的名字不匹配且没有指定 @PathVariable 的名称,Spring Boot 会抛出异常,因为它无法确定如何将 URL 中的值绑定到方法参数上。

示例:

java 复制代码
@GetMapping("/users/{userId}")
public String getUserById(@PathVariable("id") Long id) { // 这里的 "id" 和 URL 中的 "userId" 不匹配
    return "User ID: " + id;
}

在这个例子中,URL 的路径变量是 {userId},但 @PathVariable 注解使用了 "id"。这会导致 Spring Boot 报错,因为它无法找到匹配的路径变量。为了避免这种错误,应确保路径变量名称与 @PathVariable 注解中指定的名称一致,或者保持方法参数名称与路径变量名称一致。

2、请求参数(Request Parameters)

2.1、接口定义

java 复制代码
@RestController
@RequestMapping("/api")
public class ExampleController {

    @GetMapping("/search")
    public String searchUser(@RequestParam("name") String name, @RequestParam("age") int age) {
        return "Name: " + name + ", Age: " + age;
    }
}

2.2、APIPost 测试

请求 URL: http://localhost:8080/api/search?name=John\&age=30

请求方法: GET

2.3、详细解释

@RequestParam 注解用于从 HTTP 请求中提取参数。在 Spring Boot 中,@RequestParam 注解的括号中可以包含不同的属性,这些属性控制如何解析请求中的参数。具体来说,这些属性可以有以下作用:

  • name:指定请求参数的名称。例如,@RequestParam(name = "param")表示将请求中名为"param"的参数的值绑定到方法的参数上。

  • value:与name属性作用相同,用于指定请求参数的名称。如果没有提供 value 属性,Spring 默认使用方法参数的名称作为参数名称。对于 Spring 4.3 及以上版本,value 属性可以省略,直接写参数名即可。

  • defaultValue:指定请求参数的默认值。如果请求中未提供该参数,则使用默认值。

  • required:指定该请求参数是否为必需的。默认为true,如果 required 设置为 true,则请求中必须包含该参数,否则会返回 400 错误。如果省略或设置为 false,则该参数是可选的。

2.4、@RequestParam应用举例

2.4.1、一般用法

在你的代码中:

java 复制代码
@RestController
@RequestMapping("/api")
public class ExampleController {

    @GetMapping("/search")
    public String searchUser(@RequestParam("name") String name, @RequestParam("age") int age) {
        return "Name: " + name + ", Age: " + age;
    }
}

@RequestParam("name")@RequestParam("age") 指定了请求中必须包含 nameage 两个参数。value 属性指定了请求参数的名称。

2.4.2、指定参数名

在某些情况下,请求参数的名称与方法参数的名称不一致。可以通过@RequestParam注解的value属性指定请求参数的名称:

java 复制代码
@GetMapping("/hello")
public String sayHello(@RequestParam("user") String name) {
    return "Hello, " + name + "!";
}

在这个示例中,请求参数的名称为user,而方法参数的名称为name。通过@RequestParam("user"),我们可以将请求参数user绑定到方法参数name上。

2.4.3、不写括号里的内容的后果

2.4.3.1、省略 value

如果你省略 value 属性,也就是注解不写参数名,Spring 默认使用方法参数的名称作为请求参数的名称。例如:

java 复制代码
@GetMapping("/search")
public String searchUser(@RequestParam String name, @RequestParam int age) {
    return "Name: " + name + ", Age: " + age;
}

假如一个请求 URL: http://localhost:8080/api/search?name=John&age=30,这样是没问题的。上面的代码等同于之前的代码,只是省略了 value 属性。

2.4.3.2、省略 valuedefaultValue

如果请求中没有提供相应的参数,且没有设置 defaultValue,Spring 将抛出 MissingServletRequestParameterException 异常,表示缺少必需的请求参数。如果将 required 设置为 false,则可以省略这些参数而不会报错。

示例:URL:http://localhost:8080/api/search?name=John ,会报错400,少了个请求参数age(因为注解的required默认为true)。

3、请求体(Request Body)

3.1、接口定义

java 复制代码
@RestController
@RequestMapping("/api")
public class ExampleController {

    @PostMapping("/users")
    public String createUser(@RequestBody User user) {
        return "User created: " + user.getName();
    }
    
    public static class User {
        private String name;
        private int age;

        // Getters and setters
        public String getName() { return name; }
        public void setName(String name) { this.name = name; }
        public int getAge() { return age; }
        public void setAge(int age) { this.age = age; }
    }
}

3.2、APIPost 测试

请求 URL: http://localhost:8080/api/users

请求方法: POST

请求体(JSON)

json 复制代码
{
    "name": "Alice",
    "age": 28
}

4、 表单数据(Form Data)

4.1、接口定义

java 复制代码
@RestController
@RequestMapping("/api")
public class ExampleController {

    @PostMapping("/form")
    public String submitForm(@RequestParam("name") String name, @RequestParam("email") String email) {
        return "Name: " + name + ", Email: " + email;
    }
}

4.2、APIPost 测试

请求 URL: http://localhost:8080/api/form

请求方法: POST

请求体(表单数据):body里边的form-data

name: Alice

email: alice@example.com

5、参考链接

参考链接1:SpringBoot接收参数的几种常用方式

参考链接2:关于日期相关问题感兴趣的可以看这一篇文章:https://blog.csdn.net/weixin_43888891/article/details/126846791

参考链接3:SpringBoot Controller接收参数的几种常用方式

相关推荐
程序员鱼皮1 小时前
我代表编程导航,向大家道歉!
前端·后端·程序员
间彧1 小时前
Spring Boot项目中如何实现Redis分布式锁
java
zjjuejin1 小时前
Maven 生命周期与插件机制
后端·maven
掘金安东尼1 小时前
AI 应用落地谈起 ,免费试用 Amazon Bedrock 的最佳时机
java·架构
阿杆2 小时前
为什么我建议你把自建 Redis 迁移到云上进行托管
redis·后端
杨杨杨大侠2 小时前
案例03-附件E-部署运维
java·docker·github
Java水解2 小时前
go语言教程(全网最全,持续更新补全)
后端·go
杨杨杨大侠2 小时前
案例03-附件B-映射器实现
java·开源·github
杨杨杨大侠2 小时前
案例03-附件A-订单实体设计
java·开源·github
杨杨杨大侠2 小时前
案例03-附件C-性能优化
java·开源·github