Java前后端传参与接收全解析

在前后端分离开发模式中,参数的传递与接收是衔接前端交互与后端逻辑的核心环节。

前端需根据后端接口设计规范,选择合适的参数传递方式;后端则需通过对应的注解或配置,精准获取前端传递的数据。有些时候分不清前端怎么传的后端怎么接收到的,这里做个总结。

本文结合Spring Boot后端与Vue前端技术栈,详细拆解几种常见的传参场景,包含后端接收实现、前端调用示例。比较常用的就是前三种,可以重点看下

文章目录

一、URL路径参数(@PathVariable)

适用场景

RESTful风格API的路径动态参数(如用户ID、订单ID),参数直接嵌入URL路径中,直观且符合资源定位逻辑。

后端接收实现

通过@PathVariable注解绑定URL路径中的参数,支持单个参数、多个参数及别名映射:

java 复制代码
// 单个路径参数
@GetMapping("/user/{id}")
public String getUserById(@PathVariable Long id) {
    return "用户ID:" + id;
}

// 多个路径参数(含别名映射)
@GetMapping("/user/{id}/order/{orderId}")
public String getUserOrder(
    @PathVariable Long id,
    @PathVariable("orderId") Long orderNo // 路径参数orderId映射为orderNo
) {
    return "用户ID:" + id + ",订单ID:" + orderNo;
}

前端调用示例

前端通过字符串拼接将参数嵌入URL路径,基于axios的封装示例:

javascript 复制代码
// API封装(paramDemo.js)
export function getPathParamDemo(id, name) {
  return request({
    url: `/demo/path/${id}/${name}`, // 路径参数拼接至URL
    method: 'get'
  })
}
//或
// API封装(paramDemo.js)
export function getPathParamDemo(id, name) {
  return request({
    url: `/demo/path/'+id+name, // 路径参数拼接至URL
    method: 'get'
  })
}

// Vue页面调用
async callPathParam() {
  try {
    const res = await getPathParamDemo(this.pathId, this.pathName);
    this.pathResult = res;
  } catch (err) {
    this.$message.error('调用失败: ' + err.message);
  }
}

二、请求参数(@RequestParam)

适用场景

URL查询字符串参数(如分页参数、筛选条件),格式为?key1=value1&key2=value2,支持必传/非必传配置、默认值及数组接收。

后端接收实现

通过@RequestParam注解获取,支持单个参数、数组/集合及默认值配置:

java 复制代码
// 基础查询参数(支持必传、默认值、非必传)
@GetMapping("/user")
public String getUser(
    @RequestParam String name, // 必传参数(默认)
    @RequestParam(defaultValue = "0") Integer page, // 默认值
    @RequestParam(required = false) Integer age // 非必传参数
) {
  return "姓名:" + name + ",年龄:" + age + ",页码:" + page;
}

// 接收数组/集合(如多爱好筛选)
@GetMapping("/hobby")
public String getHobby(@RequestParam List<String> hobby) {
  return "爱好:" + hobby; // 接收?hobby=reading&hobby=sports格式参数
}

前端调用示例

前端通过params属性传递参数,axios会自动拼接为查询字符串:

javascript 复制代码
// API封装
export function getQueryParamDemo(page, size, keyword) {
  return request({
    url: '/demo/query',
    method: 'get',
    params: { // 自动转为?page=1&size=10&keyword=xxx
      page,
      size,
      keyword
    }
  })
}

// Vue页面调用
async callQueryParam() {
  try {
    const res = await getQueryParamDemo(this.page, this.size, this.keyword);
    this.queryResult = res;
  } catch (err) {
    this.$message.error('调用失败: ' + err.message);
  }
}

三、JSON请求体(@RequestBody)

适用场景

前后端分离场景下的复杂数据传递(如创建/更新资源),参数格式为application/json,支持嵌套对象。

后端接收实现

通过@RequestBody注解直接绑定实体类,自动解析JSON格式请求体:

java 复制代码
@PostMapping("/user/save")
public String saveUser(@RequestBody User user) { // User类需与JSON字段对应
  return "保存用户:" + user.getUsername();
}

前端调用示例

直接传递JavaScript对象,axios会自动转为JSON格式并设置请求头:

javascript 复制代码
// API封装
export function postJsonDataDemo(user) {
  return request({
    url: '/demo/json',
    method: 'post',
    data: user // 直接传递对象,自动转为JSON
  })
}

// Vue页面调用
async callJsonData() {
  try {
    const res = await postJsonDataDemo(this.user); // this.user为{name: '', age: ''}
    this.jsonResult = res;
  } catch (err) {
    this.$message.error('调用失败: ' + err.message);
  }
}

四、请求头参数(@RequestHeader)

适用场景

全局配置信息(如Token、用户类型),参数存储在HTTP请求头中,避免暴露敏感数据。

后端接收实现

通过@RequestHeader注解获取请求头字段,支持别名映射:

java 复制代码
@GetMapping("/header")
public String getHeader(
    @RequestHeader String token, // 直接获取token字段
    @RequestHeader("Content-Type") String contentType // 别名映射
) {
  return "Token:" + token + ",Content-Type:" + contentType;
}

前端调用示例

headers中配置自定义请求头字段:

javascript 复制代码
// API封装
export function getHeaderParamDemo(token) {
  return request({
    url: '/demo/header',
    method: 'get',
    headers: {
      'X-Token': token, // 自定义Token字段
      'User-Type': 'admin' // 额外请求头信息
    }
  })
}

// Vue页面调用
async callHeaderParam() {
  try {
    const res = await getHeaderParamDemo(this.token);
    this.headerResult = res;
  } catch (err) {
    this.$message.error('调用失败: ' + err.message);
  }
}

五、Cookie参数(@CookieValue)

适用场景

基于Cookie的会话保持(如sessionId),参数存储在客户端Cookie中,随请求自动发送。

后端接收实现

通过@CookieValue注解指定Cookie名称获取:

java 复制代码
@GetMapping("/cookie")
public String getCookie(@CookieValue("sessionId") String sessionId) {
  return "SessionID:" + sessionId;
}

前端调用示例

Cookie会随请求自动发送(需确保前端可访问对应Cookie),无需额外配置参数:

javascript 复制代码
// API封装
export function getCookieParamDemo() {
  return request({
    url: '/demo/cookie',
    method: 'get' // Cookie自动携带
  })
}

// Vue页面直接调用
async callCookieParam() {
  try {
    const res = await getCookieParamDemo();
    this.cookieResult = res;
  } catch (err) {
    this.$message.error('调用失败: ' + err.message);
  }
}

六、文件上传(MultipartFile)

适用场景

文件上传(如图片、文档),参数格式为multipart/form-data,支持单个文件+额外参数。

后端接收实现

通过MultipartFile接收文件,配合@RequestParam获取额外参数:

java 复制代码
@PostMapping("/upload")
public String uploadFile(
    @RequestParam("file") MultipartFile file, // 与前端表单字段名一致
    @RequestParam(required = false) String desc // 额外描述参数
) throws IOException {
  String fileName = file.getOriginalFilename();
  // 文件保存逻辑(如写入本地或OSS)
  return "上传成功:" + fileName;
}

前端调用示例

通过FormData构造表单数据,指定请求头multipart/form-data

javascript 复制代码
// API封装
export function uploadFileDemo(file, desc) {
  const formData = new FormData();
  formData.append('file', file); // 文件名需与后端@RequestParam一致
  formData.append('desc', desc); // 附加额外参数
  return request({
    url: '/demo/upload',
    method: 'post',
    data: formData,
    headers: {
      'Content-Type': 'multipart/form-data' // 文件上传类型标识
    }
  })
}

// Vue页面调用(结合Element UI上传组件)
handleFileChange(file) {
  this.file = file.raw; // 保存原始文件对象
},
async callUploadFile() {
  if (!this.file) {
    this.$message.warning('请先选择文件');
    return;
  }
  try {
    const res = await uploadFileDemo(this.file, '测试文件');
    this.uploadResult = res;
  } catch (err) {
    this.$message.error('上传失败: ' + err.message);
  }
}

七、核心总结与注意事项

传参方式选型表

传递方式 后端注解/类型 前端配置要点 适用场景
路径参数 @PathVariable URL字符串拼接 RESTful资源定位(ID类参数)
查询参数 @RequestParam params属性传递,自动拼接查询字符串 分页、筛选等简单参数
JSON请求体 @RequestBody 直接传递对象,axios自动转JSON 复杂数据(嵌套对象、多字段)
请求头参数 @RequestHeader headers属性配置自定义字段 Token、用户类型等全局信息
Cookie参数 @CookieValue 无需额外配置,Cookie自动携带 会话保持(sessionId)
文件上传 MultipartFile FormData构造数据,Content-Type: multipart/form-data 图片、文档上传

关键注意事项

  1. 参数名一致性:前端传递的参数名(如表单字段、JSON键名)需与后端注解/实体类属性名一致,否则无法映射。
  2. Content-Type匹配:表单参数需指定application/x-www-form-urlencoded,文件上传需指定multipart/form-data,JSON请求体无需手动设置(axios自动处理)。
  3. 非必传参数配置:查询参数、表单参数需通过required = false声明非必传,避免请求报错。

通过以上这几种传参方式的组合,可覆盖绝大多数Java前后端开发场景。实际开发中,需根据参数类型、业务场景选择合适的方式,确保参数传递的高效性与安全性。

相关推荐
卷毛的技术笔记37 分钟前
告别硬编码!Spring AI Alibaba 实现 AI Agent 智能工具调用(Tool Calling)
java·人工智能·后端·python·spring·ai编程
编程大师哥38 分钟前
匿名函数 lambda + 高阶函数
java·python·算法
isyangli_blog40 分钟前
OpenDayLight (Carbon 版本) 启动与组件安装
开发语言·php
vb2008111 小时前
FastAPI APIRouter
开发语言·python
Benszen1 小时前
KVM虚拟化解决方案
开发语言·perl
会编程的土豆1 小时前
Go 语言反射(Reflection)详解
开发语言·后端·golang
東雪木1 小时前
多线程与并发编程 专属复习笔记
java·开发语言·笔记·java面试
adrninistrat0r1 小时前
Java调用链MCP分析工具
java·python·ai编程
杨充1 小时前
1.3 浮点型数据设计灵魂
开发语言·python·算法
噜噜噜阿鲁~1 小时前
python学习笔记 | 11.3、面向对象高级编程-多重继承
java·开发语言