1.@RequestParam
@RequestParam可以从 URL 中提取请求参数,并将它们绑定到方法的参数上。
一般多用于get请求,但是其它的请求格式也可以使用。
基本用法
假设有一个简单的 GET 请求,URL 如下:
http://localhost:8080/greet?name=John&age=25
在这个请求中,name 和 age 是查询参数。可以使用 @RequestParam 注解来提取这些参数并将其传递给控制器的方法。
@RestController
public class GreetingController {
@GetMapping("/greet")
public String greet(@RequestParam String name, @RequestParam int age) {
return "Hello " + name + ", you are " + age + " years old.";
}
}
给前端返回:
Hello John, you are 25 years old.
常用属性
-
requiredrequired属性用来指定请求中是否必须包含这个参数,默认为true。所以,写了@RequestParam注解,就说明这个参数前端必须要传,如果不传,spring会报错:
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 + "!";
}
}
如果这个参数也可以不传,要这样写:
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 + "!";
}
}
defaultValuedefaultValue属性可以指定当请求中没有该参数时使用的默认值。这个属性在参数为required = false时非常有用。
@GetMapping("/greet")
public String greet(@RequestParam(defaultValue = "Guest") String name) {
return "Hello " + name;
}
处理多个参数
@GetMapping("/user")
public String user(@RequestParam String username, @RequestParam int age) {
return "User: " + username + ", Age: " + age;
}
POST 请求中使用@RequestParam
在 POST 请求中,@RequestParam 可以用来处理 表单提交的数据。这种情况通常见于 HTML 表单通过 POST 请求发送数据时。
@PostMapping("/submitForm")
public String handleFormSubmission(@RequestParam String username, @RequestParam String password) {
return "Received username: " + username + " and password: " + password;
}
比如,前端的表单是这样的:
<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 查询参数:
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";
}
}
比如表单数据:
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表单是这样的:
<form action="/login" method="post">
<input type="text" name="name" />
<input type="password" name="password" />
<button type="submit">Login</button>
</form>
但是前端要传递的是json对象,这个时候就不能什么都不写了:
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,后端就可以拿到:
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 类,如下所示:
public class User {
private String username;
private String password;
private int age;
// Getters and setters
}
假设我们有一个前端发送 JSON 格式数据的 POST 请求,URL 为 /user,请求体内容如下:
{
"username": "john_doe",
"password": "password123",
"age": 30
}
在 Spring Boot 中,我们可以通过 @RequestBody 来自动将 JSON 数据转换为 User 对象。
@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 中的路径参数。
基本用法
/users/{id}
假设我们有一个表示用户信息的 RESTful API,URL 格式如下:
假设我们要从 URL /users/{id} 提取 id 参数,并将其作为方法的参数:
@RestController
public class UserController {
@GetMapping("/users/{id}")
public String getUser(@PathVariable Integer id) {
return "User ID: " + id;
}
}