当前位置: 首页 > 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格式

相关文章:

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

RequestBody 只能用一次,因为只有一个请求体 #mermaid-svg-8WZfkzl0GPvOiNj3 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-8WZfkzl0GPvOiNj3 .error-icon{fill:#552222;}#mermaid-svg-8WZfkzl0GPvOiNj…...

AutoUpdater.NET 实现 dotNET应用自动更新

AutoUpdater.NET 是一款用于WPF、Winform软件版本更新的框架,类似框架还有Squirrel、WinSparkle、NetSparkle、Google Omaha。 一、安装AutoUpdater.NET 首先,您需要在项目中安装AutoUpdater.NET库。您可以通过NuGet包管理器来安装它。在Visual Studio中…...

108. UE5 GAS RPG 实现地图名称更新和加载关卡

在这一篇里,我们将实现对存档的删除功能,在删除时会有弹框确认。接着实现获取玩家的等级和地图名称和存档位置,我们可以通过存档进入游戏,玩家在游戏中可以在存档点存储存档。 实现删除存档 删除存档需要一个弹框确认&#xff0…...

对称加密与非对称加密:密码学的基石及 RSA 算法详解

对称加密与非对称加密:密码学的基石及 RSA 算法详解 在当今数字化的时代,信息安全至关重要。对称加密和非对称加密作为密码学中的两种基本加密技术,为我们的数据安全提供了强大的保障。本文将深入探讨对称加密和非对称加密的特点、应用场景&…...

排列问题方法总结(递归+迭代)

递归 一、逐步生成结果法&#xff08;无序&#xff09; #include<iostream> #include<vector> #include<string> #include<algorithm>using namespace std;vector<string> GetChild(int n,int curIndex){vector<string> now;vector&…...

C#从入门到放弃

C#和.NET的区别 C# C#是一个编程语言 .NET .NET是一个在window下创建程序的框架 .NET框架不仅局限于C#,它还可以支持很多语言 .NET包括了2个组件&#xff0c;一个叫CLR(通用语言运行时)&#xff0c;另一个是用来构建程序的类库 CLR 用C写一个程序&#xff0c;在一台8688的机器…...

视频质量评价学习笔记

目录 MD VQA:大淘宝团队&#xff1a; ReIQA KVQ 视频质量评价学习笔记 MD VQA:大淘宝团队&#xff1a; https://github.com/kunyou99/MD-VQA_cvpr2023?tabreadme-ov-file ReIQA GitHub - avinabsaha/ReIQA: Official implementation for CVPR2023 Paper "Re-IQA : U…...

OpenCV、YOLO、VOC、COCO之间的关系和区别

OpenCV、YOLO、COCO 和 VOC 是计算机视觉和深度学习领域常见的几个名词&#xff0c;它们分别代表不同的工具、算法和数据集&#xff0c;之间有一些联系和区别。下面分别说明它们的定义、用途以及相互关系。 1. OpenCV&#xff08;Open Source Computer Vision Library&#xf…...

Pandas进行周期与时间戳转换

时间序列数据在数据分析和金融领域非常常见,处理这些数据时,通常会面临周期(Period)与时间戳(Timestamp)之间的转换需求。理解和掌握这种转换,对于时间序列数据的清洗、预处理以及进一步分析至关重要。Python 中的 pandas 库提供了一系列便捷的函数来帮助处理这些时间序…...

【GPTs】Get Simpsonized:一键变身趣味辛普森角色

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | GPTs应用实例 文章目录 &#x1f4af;GPTs指令&#x1f4af;前言&#x1f4af;Get Simpsonized主要功能适用场景优点缺点使用方式 &#x1f4af;小结 &#x1f4af;GPTs指令 中文翻译&#xff1a; 指令保护和安全规则&…...

概率论公式整理

1 概率 古典概型和几何概型 古典概型&#xff08;有限等可能&#xff09;几何概型&#xff08;无限等可能&#xff09; 条件概率 P ( A ∣ B ) P ( A B ) P ( B ) P(A|B) \frac{P(AB)}{P(B)} P(A∣B)P(B)P(AB)​ 全概率公式 P ( B ) ∑ i 1 n P ( A i ) P ( B ∣ A i ) P…...

【C++】—— stack和queue的模拟实现

前言 ​ stack 和 queue使用起来都非常简单&#xff0c;现在来模拟实现一下&#xff0c;理解其底层的原理。 ​ 在实现之前&#xff0c;应该知道&#xff0c;stack 和 queue 都是容器适配器&#xff0c;通过看官网文件也可以看出来&#xff1b;其默认的容器都是deque&#xff…...

管家婆工贸ERP BR039.采购订单关联MRP明细表

最低适用版本&#xff1a; 工贸系列 23.8 插件简要功能说明&#xff1a; 采购订单明细表&#xff0c;支持显示采购订单明细上游请购单明细关联的MRP中对应销售订单明细产成品相关信息更多细节描述见下方详细文档 插件操作视频&#xff1a; 进销存类定制插件--采购订单关联M…...

SwanLab安装教程

SwanLab是一款开源、轻量级的AI实验跟踪工具&#xff0c;提供了一个跟踪、比较、和协作实验的平台&#xff0c;旨在加速AI研发团队100倍的研发效率。 其提供了友好的API和漂亮的界面&#xff0c;结合了超参数跟踪、指标记录、在线协作、实验链接分享、实时消息通知等功能&…...

MySQL EXPLAIN,数据库调优的秘密通道

EXPLAIN 是 MySQL 中一个非常有用的工具&#xff0c;它用于分析 SQL 查询的执行计划。通过 EXPLAIN&#xff0c;你可以获取 MySQL 是如何准备执行你的 SQL 语句的&#xff0c;包括使用的索引、连接类型、扫描的行数等信息。这些信息对于优化查询性能、识别性能瓶颈至关重要。 使…...

利用redis的key失效监听器KeyExpirationEventMessageListener作任务定时提醒功能

某需求&#xff1a; 要求在任务截止日期的前3天时&#xff0c;系统自动给用户发一条消息提醒。 用定时任务的话感觉很不舒服。间隔时间不好弄。不能精准卡到那个点。 由于系统简单&#xff0c;没有使用消息列队&#xff0c;也不能使用延时队列来做。 用Timer的话开销还挺大的&a…...

如何基于Tesseract实现图片的文本识别

在前一篇文章基础上&#xff0c;如何将报告图片中的文本解析出来&#xff0c;最近研究了基于Tesseract的OCR方案&#xff0c;Tesseract OCR是一个开源的OCR引擎&#xff0c;主要结合开源的tesseract和pytesseract&#xff0c;实现了jpg/png等格式图片文本识别&#xff0c;供大家…...

JavaWeb之AJAX

前言 这一节讲JavaWeb之AJAX 1.概述 以前我们在servlet中得到数据&#xff0c;必须通过域给jsp&#xff0c;然后jsp在响应给浏览器 纯html不能获取servlet返回数据 所以我们用jsp 但是现在我们可以同AJAX给返回数据了 我们可以在sevlet中直接通过AJAX返回给浏览器 html中的J…...

算法---解决“汉诺塔”问题

# 初始化步骤计数器 i 1 # 定义移动盘子的函数 def move(n, mfrom, mto): global i # 使用全局变量i来跟踪步骤 print("第%d步:将%d号盘子从%s->%s" % (i, n, mfrom, mto)) # 打印移动步骤 i 1 # 步骤计数器加1 #第一种方法 # 定义汉诺塔问题的递归…...

1-Equity-Transformer:求解NP-Hard Min-Max路由问题的顺序生成算法(AAAI-24)(完)(code)

文章目录 AbstractIntroduction问题表述Methodology多智能体位置编码公平上下文编码训练方案ExperimentsmTSP的性能评估mPDP的性能评估Related WorkConclusionAbstract 最小最大路由问题旨在通过智能体合作完成任务来最小化多个智能体中最长行程的长度。这些问题包括对现实世界…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中&#xff0c;我们渴望一个能激发创想、愉悦感官的工作与生活伙伴&#xff0c;它不仅是冰冷的科技工具&#xff0c;更能触动我们内心深处的细腻情感。正是在这样的期许下&#xff0c;华硕a豆14 Air香氛版翩然而至&#xff0c;它以一种前所未有的方式&#x…...

Linux系统部署KES

1、安装准备 1.版本说明V008R006C009B0014 V008&#xff1a;是version产品的大版本。 R006&#xff1a;是release产品特性版本。 C009&#xff1a;是通用版 B0014&#xff1a;是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存&#xff1a;1GB 以上 硬盘&#xf…...

论文阅读:Matting by Generation

今天介绍一篇关于 matting 抠图的文章&#xff0c;抠图也算是计算机视觉里面非常经典的一个任务了。从早期的经典算法到如今的深度学习算法&#xff0c;已经有很多的工作和这个任务相关。这两年 diffusion 模型很火&#xff0c;大家又开始用 diffusion 模型做各种 CV 任务了&am…...

Python训练营-Day26-函数专题1:函数定义与参数

题目1&#xff1a;计算圆的面积 任务&#xff1a; 编写一个名为 calculate_circle_area 的函数&#xff0c;该函数接收圆的半径 radius 作为参数&#xff0c;并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求&#xff1a;函数接收一个位置参数 radi…...

ui框架-文件列表展示

ui框架-文件列表展示 介绍 UI框架的文件列表展示组件&#xff0c;可以展示文件夹&#xff0c;支持列表展示和图标展示模式。组件提供了丰富的功能和可配置选项&#xff0c;适用于文件管理、文件上传等场景。 功能特性 支持列表模式和网格模式的切换展示支持文件和文件夹的层…...

路由基础-路由表

本篇将会向读者介绍路由的基本概念。 前言 在一个典型的数据通信网络中&#xff0c;往往存在多个不同的IP网段&#xff0c;数据在不同的IP网段之间交互是需要借助三层设备的&#xff0c;这些设备具备路由能力&#xff0c;能够实现数据的跨网段转发。 路由是数据通信网络中最基…...

验证redis数据结构

一、功能验证 1.验证redis的数据结构&#xff08;如字符串、列表、哈希、集合、有序集合等&#xff09;是否按照预期工作。 2、常见的数据结构验证方法&#xff1a; ①字符串&#xff08;string&#xff09; 测试基本操作 set、get、incr、decr 验证字符串的长度和内容是否正…...