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

流程图图解@RequestBody @RequestPart @RequestParam @ModelAttribute

@RequestBody 只能用一次,因为只有一个请求体

@RequestBody 流程
application/json
自动转换
Spring接收请求
前端发送JSON数据
Java对象
处理业务逻辑

示例代码:

// 1. @RequestBody示例 - 用于接收JSON数据
// 前端代码:
const user = {name: "张三",age: 25,phone: "13812345678"
};fetch('/api/user', {method: 'POST',headers: {'Content-Type': 'application/json'},body: JSON.stringify(user)
});// 后端代码:
@PostMapping("/api/user")
public R createUser(@RequestBody User user) {System.out.println(user.getName());    // 输出:张三return R.ok();
}

@RequestPart

@RequestPart 流程
multipart/form-data
JSON部分
文件部分
Spring接收复合请求
前端发送表单数据
Java对象
MultipartFile
处理业务逻辑

示例代码:
在这里插入图片描述

// 2. @RequestPart示例 - 用于文件上传+JSON
// 前端代码:
const formData = new FormData();
const userInfo = {name: "张三",age: 25
};
formData.append('userInfo', JSON.stringify(userInfo));
formData.append('avatar', fileInput.files[0]);  // 文件fetch('/api/user/profile', {method: 'POST',body: formData
});// 后端代码:
@PostMapping("/api/user/profile")
public R updateProfile(@RequestPart("userInfo") User user,@RequestPart("avatar") MultipartFile file
) {// 处理用户信息System.out.println(user.getName());    // 输出:张三// 处理文件String fileName = file.getOriginalFilename();return R.ok();
}

@ModelAttribute

@ModelAttribute 流程
form-data
自动映射字段
Spring接收表单
前端发送表单数据
Java对象
处理业务逻辑

示例代码:

// 3. @ModelAttribute示例 - 用于接收表单数据
// 前端代码:
const formData = new FormData();
formData.append('name', '张三');
formData.append('age', '25');
formData.append('phone', '13812345678');fetch('/api/user/create', {method: 'POST',body: formData
});// 后端代码:
@PostMapping("/api/user/create")
public R createUser(@ModelAttribute User user) {System.out.println(user.getName());    // 输出:张三return R.ok();
}

@RequestParam

@RequestParam 流程
URL参数或表单字段
自动类型转换
Spring接收单个参数
前端发送参数
Java基本类型
处理业务逻辑

示例代码:

// 4. @RequestParam示例 - 用于接收URL参数或单个表单字段
// 前端代码 - URL参数方式:
fetch('/api/user/search?name=张三&age=25');// 后端代码:
@GetMapping("/api/user/search")
public R searchUser(@RequestParam String name,                    // 必填参数@RequestParam(required = false) Integer age,  // 可选参数@RequestParam(defaultValue = "1") int page    // 带默认值的参数
) {System.out.println(name);     // 输出:张三System.out.println(age);      // 输出:25System.out.println(page);     // 如果未传,输出默认值:1return R.ok();
}

用户登录例子

// 实战示例:用户注册(包含基本信息和头像)
// 方式一:使用 @RequestPart(适合JSON)
@PostMapping("/register")
public R registerWithJson(@RequestPart("userInfo") UserRegisterDTO userInfo,  // JSON格式的用户信息@RequestPart("avatar") MultipartFile avatar         // 头像文件
) {String username = userInfo.getUsername();  // 从JSON中获取用户名String password = userInfo.getPassword();  // 从JSON中获取密码// 处理头像文件String avatarPath = saveAvatar(avatar);    // 保存头像// 处理注册逻辑return R.ok();
}// 方式二:使用 @ModelAttribute(适合普通表单)
@PostMapping("/register")
public R registerWithForm(@ModelAttribute UserRegisterDTO userInfo,    // 表单字段自动映射@RequestParam("avatar") MultipartFile avatar // 头像文件
) {String username = userInfo.getUsername();  // 从表单中获取用户名String password = userInfo.getPassword();  // 从表单中获取密码// 处理头像文件String avatarPath = saveAvatar(avatar);    // 保存头像// 处理注册逻辑return R.ok();
}

简单总结一下这四种注解的使用场景:

  1. @RequestBody

    • 特点:专门用于接收JSON数据
    • 使用场景:前端传递复杂JSON对象时
    • 常见用途:RESTful API的POST请求
  2. @RequestPart

    • 特点:可以同时处理文件和JSON数据
    • 使用场景:文件上传+复杂数据提交
    • 常见用途:带文件上传的表单提交
  3. @ModelAttribute

    • 特点:自动映射表单字段到对象
    • 使用场景:普通表单提交
    • 常见用途:简单的表单处理
  4. @RequestParam

    • 特点:接收单个参数
    • 使用场景:URL参数或简单表单字段
    • 常见用途:GET请求参数处理

实际应用建议:

  1. 如果是纯JSON数据传输,用@RequestBody
  2. 如果有文件上传,用@RequestPart
  3. 如果是普通表单提交,用@ModelAttribute
  4. 如果只是几个简单参数,用@RequestParam
    在这里插入图片描述

注意事项:

@RequestBody只能用一次,因为只有一个请求体
@RequestParam和@RequestPart的区别在于,RequestPart支持复杂对象的JSON数据
@ModelAttribute适合form表单,自动处理字段映射
文件上传一定要用multipart/form-data格式

http://www.lryc.cn/news/485640.html

相关文章:

  • AutoUpdater.NET 实现 dotNET应用自动更新
  • 108. UE5 GAS RPG 实现地图名称更新和加载关卡
  • 对称加密与非对称加密:密码学的基石及 RSA 算法详解
  • 排列问题方法总结(递归+迭代)
  • C#从入门到放弃
  • 视频质量评价学习笔记
  • OpenCV、YOLO、VOC、COCO之间的关系和区别
  • Pandas进行周期与时间戳转换
  • 【GPTs】Get Simpsonized:一键变身趣味辛普森角色
  • 概率论公式整理
  • 【C++】—— stack和queue的模拟实现
  • 管家婆工贸ERP BR039.采购订单关联MRP明细表
  • SwanLab安装教程
  • MySQL EXPLAIN,数据库调优的秘密通道
  • 利用redis的key失效监听器KeyExpirationEventMessageListener作任务定时提醒功能
  • 如何基于Tesseract实现图片的文本识别
  • JavaWeb之AJAX
  • 算法---解决“汉诺塔”问题
  • 1-Equity-Transformer:求解NP-Hard Min-Max路由问题的顺序生成算法(AAAI-24)(完)(code)
  • linux001.在Oracle VM VirtualBox中ubuntu虚拟系统扩容
  • RabbitMQ教程:路由(Routing)(四)
  • 华为Ensp模拟器配置RIP路由协议
  • 3. langgraph中的react agent使用 (在react agent添加系统提示)
  • (02)ES6教程——Map、Set、Reflect、Proxy、字符串、数值、对象、数组、函数
  • 【快速解决】kafka崩了,重启之后,想继续消费,怎么做?
  • C++ 的发展
  • RabbitMQ 高级特性——延迟队列
  • ‌EAC(Estimate at Completion)和ETC(Estimate to Complete)
  • 【React】状态管理之Zustand
  • Vue3打包自动生成版本JSON文件,添加系统版本检查,实现系统自动更新提示