1206 字
6 分钟
Spring Boot接口参数接收和前端请求
Spring Boot接口参数接收和前端请求
这是一份关于 Spring Boot 后端接口与 Vue / React 前端请求的全面指南。为了让内容更贴近企业级实战,我们在后端部分先定义一个“统一响应体”,然后在前后端代码中保持接口路径的一致性,方便你对照学习。
第一部分:Spring Boot 后端开发指南
在实际开发中,我们通常会定义一个统一的返回格式(如 Result<T>),以便前端统一处理状态码和提示信息。
// 统一返回对象示例@Datapublic class Result<T> { private Integer code; // 200表示成功,500表示失败等 private String message; private T data;
public static <T> Result<T> success(T data) { // ... 构建成功响应 }}下面是各种常见请求接收与返回的写法(使用 @RestController 注解,它等同于 @Controller + @ResponseBody,所有方法默认返回 JSON)。
1. 接收路径参数 (Path Variable)
常用于 RESTful 风格的按 ID 查询、删除、修改操作。
@GetMapping("/api/users/{id}")public Result<User> getUserById(@PathVariable("id") Long id) { User user = userService.getById(id); return Result.success(user);}2. 接收查询参数 (Query Parameter)
即 URL 中 ?key=value&key2=value2 的形式。常用于 GET 请求的分页、搜索。
// 方式一:单独接收参数@GetMapping("/api/users/search")public Result<List<User>> searchUsers( @RequestParam(value = "keyword", required = false) String keyword, @RequestParam(value = "page", defaultValue = "1") Integer page) { return Result.success(userService.search(keyword, page));}
// 方式二:使用对象接收(推荐用于参数较多时,不要加 @RequestBody)@GetMapping("/api/users/list")public Result<List<User>> listUsers(UserQueryDTO queryDTO) { return Result.success(userService.list(queryDTO));}3. 接收 JSON 请求体 (JSON Body)
常用于 POST、PUT 请求,提交复杂的表单数据。必须使用 @RequestBody 注解。
@PostMapping("/api/users")public Result<User> createUser(@RequestBody UserDTO userDTO) { User savedUser = userService.save(userDTO); return Result.success(savedUser);}4. 接收表单请求与文件上传 (Multipart / Form-Data)
常用于上传头像、文档等。前端 Content-Type 为 multipart/form-data。
@PostMapping("/api/users/upload")public Result<String> uploadAvatar( @RequestParam("userId") Long userId, @RequestPart("file") MultipartFile file) { // 或使用 @RequestParam("file")
if (file.isEmpty()) return Result.error("文件不能为空"); String fileUrl = fileService.saveFile(file); return Result.success(fileUrl);}5. 接收请求头或 Cookie (Headers / Cookies)
用于获取 Token 或特定标识。
@GetMapping("/api/users/profile")public Result<User> getProfile( @RequestHeader("Authorization") String token, @CookieValue(value = "sessionId", required = false) String sessionId) { // 解析 token 获取用户信息 return Result.success(user);}6. 返回文件流 (File Download)
如果不是返回 JSON,而是让浏览器下载文件,需要返回 ResponseEntity 或直接写 HttpServletResponse。
@GetMapping("/api/files/download/{fileName}")public ResponseEntity<Resource> downloadFile(@PathVariable String fileName) { Resource resource = fileService.loadFileAsResource(fileName); return ResponseEntity.ok() .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + resource.getFilename() + "\"") .body(resource);}第二部分:前端请求指南 (Vue & React)
前端主要关注 请求方法 (Method) 和 传参位置 (Params vs Data)。
- Params: 拼接到 URL 后面的查询参数(对应后端的
@RequestParam或对象)。 - Data/Body: 放在请求体里的数据(对应后端的
@RequestBody)。
Vue 3 示例 (使用 Axios)
Axios 是 Vue 生态中最常用的 HTTP 客户端。
import axios from 'axios';
// 1. 发送 GET 请求 (路径参数 + 查询参数)const getUserAndSearch = async () => { // 对应后端 @PathVariable const res1 = await axios.get('/api/users/123');
// 对应后端 @RequestParam const res2 = await axios.get('/api/users/search', { params: { keyword: 'Tom', page: 1 } // axios 会自动拼接成 ?keyword=Tom&page=1 }); console.log(res2.data); // 后端返回的 Result 对象};
// 2. 发送 POST 请求 (JSON 数据)const createUser = async () => { const userData = { name: 'Alice', age: 25 }; // 对应后端 @RequestBody,axios 默认使用 application/json const res = await axios.post('/api/users', userData);};
// 3. 上传文件 (FormData)const uploadFile = async (fileObject) => { const formData = new FormData(); formData.append('userId', '123'); formData.append('file', fileObject); // fileObject 是从 <input type="file"> 获取的
const res = await axios.post('/api/users/upload', formData, { headers: { 'Content-Type': 'multipart/form-data' // 必须明确指定 } });};React 示例 (使用 Fetch API)
React 中常用 Axios,但原生 Fetch API 也非常普遍。这里演示 Fetch 的标准写法。
// 1. 发送 GET 请求 (路径参数 + 查询参数)const getUserAndSearch = async () => { // URL 参数需要手动拼接,或者使用 URLSearchParams const params = new URLSearchParams({ keyword: 'Tom', page: 1 });
const response = await fetch(`/api/users/search?${params.toString()}`); const result = await response.json(); // 解析后端返回的 JSON console.log(result);};
// 2. 发送 POST 请求 (JSON 数据)const createUser = async () => { const userData = { name: 'Alice', age: 25 };
const response = await fetch('/api/users', { method: 'POST', headers: { 'Content-Type': 'application/json' // 必须告诉后端这是 JSON }, body: JSON.stringify(userData) // 必须序列化为字符串 }); const result = await response.json();};
// 3. 上传文件 (FormData)const uploadFile = async (fileObject) => { const formData = new FormData(); formData.append('userId', '123'); formData.append('file', fileObject);
const response = await fetch('/api/users/upload', { method: 'POST', // 注意:使用 fetch 传 FormData 时,千万**不要**手动设置 Content-Type 头! // 浏览器会自动设置正确的带有 boundary 的 multipart/form-data body: formData }); const result = await response.json();};核心总结记忆口诀:
- 后端用
@PathVariable,前端就拼在斜杠/后面。 - 后端用
@RequestParam或不加注解的对象,前端 GET 请求用params,POST 请求用 URL 拼接或x-www-form-urlencoded。 - 后端用
@RequestBody,前端就发 JSON,放在请求体里(Axios 的data,Fetch 的body)。 - 传文件必定是
FormData,后端用MultipartFile接收。
在你的实际项目开发中,目前最让你感到困惑的是哪一种数据传输场景?是复杂对象的嵌套传参,还是文件与文本混合上传的处理?
Spring Boot接口参数接收和前端请求
http://www.shineacz.top/posts/spring-boot接口参数接收和前端请求/