当前位置: 首页 > news >正文

在 Spring Boot 中,针对表单提交和请求体提交(如 JSON) 两种数据格式,服务器端有不同的接收和处理方式,

在 Spring Boot 中,针对表单提交和请求体提交(如 JSON) 两种数据格式,服务器端有不同的接收和处理方式,核心是通过注解和参数绑定机制实现自动解析。

**表单提交 (Form Submission):**主要用于浏览器向服务器发送数据,如用户登录、搜索等。数据被编码在请求体中,格式为 key=value,通过 application/x-www-form-urlencoded 或 multipart/form-data 类型的请求头告知服务器。
**请求体提交 (Body Submission):**是现代 API 交互(如 RESTful)的标准方式。客户端(如 App、前端 JS)将数据(通常是 JSON 格式)直接放入请求体中,通过 application/json 等类型的请求头告知服务器。

一、接收表单提交数据(application/x-www-form-urlencoded 或 multipart/form-data)
表单提交的数据以键值对形式存在,Spring Boot 主要通过以下方式接收:

1. 简单参数接收(直接绑定到方法参数)
适用于参数较少的场景,使用 @RequestParam 注解(可省略):

@PostMapping("/form/simple")
public String handleSimpleForm(// @RequestParam 可省略,默认按参数名匹配@RequestParam String username,@RequestParam Integer age,// 可选参数,设置默认值@RequestParam(defaultValue = "male") String gender
) {return "接收表单数据:username=" + username + ", age=" + age + ", gender=" + gender;
}

2. 实体类接收(参数较多时推荐)
将表单字段映射到实体类的属性(属性名需与表单字段名一致):

java
运行
// 定义实体类
public class UserForm {private String username;private Integer age;private String gender;// getter/setter
}
// 控制器接收
@PostMapping("/form/entity")
public String handleEntityForm(UserForm user) {return "接收表单实体:" + user.getUsername() + ", " + user.getAge();
}

3. 接收文件(multipart/form-data 格式)
用于文件上传,需使用 @RequestParam(“file”) MultipartFile 接收:

@PostMapping("/form/upload")
public String handleFileUpload(@RequestParam String description, // 普通字段@RequestParam("file") MultipartFile file // 文件字段
) throws IOException {// 保存文件到本地String filename = file.getOriginalFilename();file.transferTo(new File("upload/" + filename));return "文件上传成功:" + description + ",文件名:" + filename;
}

注意:默认情况下,Spring Boot 对文件大小有限制(默认单文件 1MB,总文件 10MB),可在 application.properties 中修改:
properties

单文件大小限制

spring.servlet.multipart.max-file-size=10MB

总文件大小限制

spring.servlet.multipart.max-request-size=100MB
二、接收请求体提交数据(如 application/json)
请求体提交的 JSON 数据需要绑定到实体类,核心是使用 @RequestBody 注解:

  1. 基本用法(绑定到实体类)
// 定义接收 JSON 的实体类
public class UserJson {private String name;private Integer age;private List<String> hobbies; // 支持数组/集合类型// getter/setter
}
// 控制器接收 JSON 数据
@PostMapping("/body/json")
public String handleJsonBody(@RequestBody UserJson user) {return "接收 JSON 数据:name=" + user.getName() + ", hobbies=" + user.getHobbies();
}
  1. 复杂 JSON 结构(嵌套对象)
    如果 JSON 包含嵌套对象,实体类也需对应嵌套结构:
json
// 客户端发送的 JSON
{"name": "张三","address": {"province": "广东","city": "深圳"}
}

对应的实体类定义:

public class UserJson {private String name;private Address address; // 嵌套对象// getter/setter// 内部类或独立类均可public static class Address {private String province;private String city;// getter/setter}
}

// 控制器接收方式不变

@PostMapping("/body/nested")
public String handleNestedJson(@RequestBody UserJson user) {return "省份:" + user.getAddress().getProvince();
}
  1. 接收纯文本或其他格式
    如果请求体是纯文本(text/plain),可直接绑定到 String:
@PostMapping(value = "/body/text", consumes = "text/plain")
public String handleTextBody(@RequestBody String text) {return "接收文本:" + text;
}

三、核心区别与原理
维度 表单提交(x-www-form-urlencoded) 请求体提交(application/json)
注解 无需特殊注解(或 @RequestParam) 必须使用 @RequestBody
数据来源 请求体中的键值对(或 URL query 参数) 请求体中的原始 JSON 字符串
解析方式 Spring 自动按名称映射到参数 / 实体属性 Spring 通过 HttpMessageConverter 解析 JSON 为实体(默认使用 Jackson)
支持的数据结构 仅支持扁平键值对(不支持嵌套对象) 支持任意复杂结构(嵌套对象、数组等)
四、常见问题与解决方案
参数名不匹配
表单提交:使用 @RequestParam(“表单字段名”) 映射,例如 @RequestParam(“user_name”) String username。
JSON 提交:在实体类属性上用 @JsonProperty(“json字段名”) 映射,例如:

public class UserJson {@JsonProperty("user_name") // 对应 JSON 中的 "user_name"private String username;
}

日期格式转换
表单提交:通过 @DateTimeFormat(pattern = “yyyy-MM-dd”) 注解转换,例如:

public class UserForm {@DateTimeFormat(pattern = "yyyy-MM-dd")private LocalDate birthday;
}

JSON 提交:通过 @JsonFormat 注解指定格式,例如:

public class UserJson {@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")private LocalDateTime createTime;
}

400 错误(参数解析失败)
检查参数类型是否匹配(如表单提交的字符串无法转为数字)。
检查 JSON 格式是否正确(如缺少引号、逗号)。
检查实体类是否有默认构造函数(JSON 解析需要)。
通过上述方式,Spring Boot 能灵活处理两种主流的 HTTP 数据提交格式,开发者只需根据前端提交的 Content-Type 选择对应的接收方式即可。

http://www.dtcms.com/a/392113.html

相关文章:

  • NL2SQL简单使用
  • 数据结构:二叉树OJ
  • 【Linux手册】生产消费者模型的多模式实践:阻塞队列、信号量与环形队列的并发设计
  • Python + Flask + API Gateway + Lambda + EKS 实战
  • 【OpenGL】openGL常见矩阵
  • DeepSeek大模型混合专家模型,DeepSeekMoE 重构 MoE 训练逻辑
  • 450. 删除二叉搜索树中的节点
  • 实用工具:基于Python的图片定位导出小程序
  • 滚珠螺杆在工业机器人关节与线性模组的智能控制
  • 【AI】coze的简单入门构建智能体
  • Python数据分析:函数定义时的装饰器,好甜的语法糖。
  • Java数据结构——包装类和泛型
  • 【C++进阶】C++11的新特性 | 列表初始化 | 可变模板参数 | 新的类功能
  • 广东省省考备考(第一百零三天9.20)——言语(强化训练)
  • 面试编程题(四)
  • OpenHarmony之充电振动定制
  • 前端单元测试入门:使用 Vitest + Vue 测试组件逻辑与交互
  • 泛英国生物样本库全基因组关联分析
  • 【LeetCode 每日一题】2785. 将字符串中的元音字母排序
  • 游戏开发中的友好提示,错误信息,异常描述等数据管理的必要性
  • 总线协议(Bus Protocol)如何支持总线错误条件?
  • simuilink 中的引用模型(reference model)的作用? 它和子系统的区别? 如何生成引用模型?
  • HTML+JS实现table表格和鼠标移入移出效果
  • windows11用Qt6自带的mingw编译OSGEarth(自用记录)
  • 仓颉编程语言青少年基础教程:泛型(Generic)和区间(Range)类型
  • 原码反码补码------相关理解
  • 【Python】字典
  • 玩转deepseek之海报生成器
  • C++强制类型转换和I/O流深度解析
  • Transformer 和 MoE