1.@RequestParam
@RequestParam
可以从 URL 中提取请求参数,并将它们绑定到方法的参数上。
一般多用于get
请求,但是其它的请求格式也可以使用。
基本用法
假设有一个简单的 GET 请求,URL 如下:
text
代码解读
复制代码
http://localhost:8080/greet?name=John&age=25
在这个请求中,name
和 age
是查询参数。可以使用 @RequestParam
注解来提取这些参数并将其传递给控制器的方法。
java
代码解读
复制代码
@RestController public class GreetingController { @GetMapping("/greet") public String greet(@RequestParam String name, @RequestParam int age) { return "Hello " + name + ", you are " + age + " years old."; } }
给前端返回:
text
代码解读
复制代码
Hello John, you are 25 years old.
常用属性
-
required
required
属性用来指定请求中是否必须包含这个参数,默认为true
。所以,写了@RequestParam
注解,就说明这个参数前端必须要传,如果不传,spring会报错:
java
代码解读
复制代码
package com.akbar.controller; import org.springframework.web.bind.annotation.*; @CrossOrigin @RestController @RequestMapping("/greet") public class TestController { @GetMapping() public String greet(@RequestParam String name) { return "Hello " + name + "!"; } }
如果这个参数也可以不传,要这样写:
java
代码解读
复制代码
package com.akbar.controller; import org.springframework.web.bind.annotation.*; @CrossOrigin @RestController @RequestMapping("/greet") public class TestController { @GetMapping() public String greet(@RequestParam(required = false) String name) { return "Hello " + name + "!"; } }
defaultValue
defaultValue
属性可以指定当请求中没有该参数时使用的默认值。这个属性在参数为required = false
时非常有用。
java
代码解读
复制代码
@GetMapping("/greet") public String greet(@RequestParam(defaultValue = "Guest") String name) { return "Hello " + name; }
处理多个参数
java
代码解读
复制代码
@GetMapping("/user") public String user(@RequestParam String username, @RequestParam int age) { return "User: " + username + ", Age: " + age; }
POST 请求中使用@RequestParam
在 POST 请求中,@RequestParam
可以用来处理 表单提交的数据。这种情况通常见于 HTML 表单通过 POST 请求发送数据时。
java
代码解读
复制代码
@PostMapping("/submitForm") public String handleFormSubmission(@RequestParam String username, @RequestParam String password) { return "Received username: " + username + " and password: " + password; }
比如,前端的表单是这样的:
html
代码解读
复制代码
<form action="/submitForm" method="post"> <input type="text" name="username" placeholder="Enter username"> <input type="password" name="password" placeholder="Enter password"> <button type="submit">Submit</button> </form>
其它请求格式
因为其它请求格式中用的很少,所以这里不演示,但是其它请求格式都可以用。
如果不写会怎么样
如果没有显式的注解,比如什么注解都没有,Spring 会自动查找请求中的参数(如 URL 查询参数或表单数据),并将它们绑定到方法的对应参数。 比如URL 查询参数:
java
代码解读
复制代码
package com.akbar.controller; import org.springframework.web.bind.annotation.*; @CrossOrigin @RestController @RequestMapping("/greet") public class TestController { @GetMapping() public String greet( String name,int age) { return "Hello " + name + ", you are "+age+" years old"; } }
比如表单数据:
java
代码解读
复制代码
package com.akbar.controller; import org.springframework.web.bind.annotation.*; @CrossOrigin @RestController @RequestMapping("/greet") public class TestController { @PostMapping public String greet( String name,int age) { return "Hello " + name + ", you are "+age+" years old"; } }
比如html表单是这样的:
html
代码解读
复制代码
<form action="/login" method="post"> <input type="text" name="name" /> <input type="password" name="password" /> <button type="submit">Login</button> </form>
但是前端要传递的是json对象,这个时候就不能什么都不写了:
java
代码解读
复制代码
package com.akbar.controller; import com.akbar.pojo.User; import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/greet") public class TestController { @PostMapping public User greet(User user) { System.out.println(user.getUsername()); System.out.println(user.getAge()); return user; } }
很显然后端拿不到这个json数据。
如果我们用@RequestBody
,后端就可以拿到:
java
代码解读
复制代码
package com.akbar.controller; import com.akbar.pojo.User; import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/greet") public class TestController { @PostMapping public User greet(@RequestBody User user) { System.out.println(user.getUsername()); System.out.println(user.getAge()); return user; } }
-
虽然不使用
@RequestParam
也能工作,但为了让代码更加明确和易于维护,建议显式地使用@RequestParam
,特别是当有多个请求参数或需要做参数验证时。 -
使用
@RequestParam
也可以为参数指定默认值、要求为必填项、进行类型转换等。
2.@RequestBody
@RequestBody
允许将请求体(一般是 JSON 格式的数据)自动转换为 Java 对象,极大地简化了数据的解析和绑定过程。
基本用法
假设我们有一个表示用户信息的 User
类,如下所示:
java
代码解读
复制代码
public class User { private String username; private String password; private int age; // Getters and setters }
假设我们有一个前端发送 JSON 格式数据的 POST 请求,URL 为 /user
,请求体内容如下:
json
代码解读
复制代码
{ "username": "john_doe", "password": "password123", "age": 30 }
在 Spring Boot 中,我们可以通过 @RequestBody
来自动将 JSON 数据转换为 User
对象。
java
代码解读
复制代码
@RestController public class UserController { @PostMapping("/user") public String createUser(@RequestBody User user) { // 使用自动绑定的 User 对象 return "Created user: " + user.getUsername() + ", Age: " + user.getAge(); } }
3.@PathVariable
@PathVariable注解用于 提取 URL 路中的变量。它通常用于处理 RESTful 风格的 URL 中的路径参数。
基本用法
text
代码解读
复制代码
/users/{id}
假设我们有一个表示用户信息的 RESTful API,URL 格式如下: 假设我们要从 URL /users/{id}
提取 id
参数,并将其作为方法的参数:
java
代码解读
复制代码
@RestController public class UserController { @GetMapping("/users/{id}") public String getUser(@PathVariable Integer id) { return "User ID: " + id; } }