1206 字
6 分钟
Spring Boot接口参数接收和前端请求

Spring Boot接口参数接收和前端请求#

这是一份关于 Spring Boot 后端接口Vue / React 前端请求的全面指南。为了让内容更贴近企业级实战,我们在后端部分先定义一个“统一响应体”,然后在前后端代码中保持接口路径的一致性,方便你对照学习。


第一部分:Spring Boot 后端开发指南#

在实际开发中,我们通常会定义一个统一的返回格式(如 Result<T>),以便前端统一处理状态码和提示信息。

// 统一返回对象示例
@Data
public 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);
}

用于获取 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接口参数接收和前端请求/
作者
shineAcZ
发布于
2026-04-15
许可协议
CC BY 4.0