目录
- [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))
-
- 2.1、接口定义
- [2.2、APIPost 测试](#2.2、APIPost 测试)
- 2.3、详细解释
- 2.4、`@RequestParam`应用举例
-
- 2.4.1、一般用法
- 2.4.2、指定参数名
- 2.4.3、不写括号里的内容的后果
-
- [2.4.3.1、省略 `value`](#2.4.3.1、省略
value
) - [2.4.3.2、省略 `value` 和 `defaultValue`](#2.4.3.2、省略
value
和defaultValue
)
- [2.4.3.1、省略 `value`](#2.4.3.1、省略
- [3、请求体(Request Body)](#3、请求体(Request Body))
-
- 3.1、接口定义
- [3.2、APIPost 测试](#3.2、APIPost 测试)
- [4、 表单数据(Form Data)](#4、 表单数据(Form Data))
-
- 4.1、接口定义
- [4.2、APIPost 测试](#4.2、APIPost 测试)
- 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")
指定了请求中必须包含 name
和 age
两个参数。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、省略 value
和 defaultValue
如果请求中没有提供相应的参数,且没有设置 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