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接收参数的几种常用方式

相关推荐
许野平14 分钟前
Rust: 利用 chrono 库实现日期和字符串互相转换
开发语言·后端·rust·字符串·转换·日期·chrono
duration~29 分钟前
Maven随笔
java·maven
zmgst33 分钟前
canal1.1.7使用canal-adapter进行mysql同步数据
java·数据库·mysql
跃ZHD42 分钟前
前后端分离,Jackson,Long精度丢失
java
blammmp1 小时前
Java:数据结构-枚举
java·开发语言·数据结构
暗黑起源喵1 小时前
设计模式-工厂设计模式
java·开发语言·设计模式
WaaTong1 小时前
Java反射
java·开发语言·反射
齐 飞2 小时前
MongoDB笔记01-概念与安装
前端·数据库·笔记·后端·mongodb
狂放不羁霸2 小时前
idea | 搭建 SpringBoot 项目之配置 Maven
spring boot·maven·intellij-idea
九圣残炎2 小时前
【从零开始的LeetCode-算法】1456. 定长子串中元音的最大数目
java·算法·leetcode