作为后端开发者,每天都要处理各种客户端请求。其中 raw
和 form-data
这两种请求体的提交方式,看似简单却常常让人纠结。因为选择的类型不同,前端的封装值的方式就不同,那么它们到底有什么不同呢?
今儿个就好好的分析分析!!!
一、本质区别
-
FormData (表单数据): 就像传统的 HTML 表单提交。数据被编码成键值对 (
key=value
),并且用特定的分隔符(boundary
)隔开。它最大的超能力是能高效上传文件。当你在网页上选了个文件点击上传时,多半就是它在幕后工作。-
Content-Type:
multipart/form-data; boundary=...
(那个 boundary 是系统自动生成的一串随机字符,用来分隔不同字段) -
数据样子:
css张三 --boundary123 Content-Disposition: form-data; name="avatar"; filename="logo.png" Content-Type: image/png [这里是logo.png文件的二进制数据] --boundary123--
-
-
Raw (原始数据): 你可以把它想象成直接"塞"一段任意格式的原始数据到请求体里,没有预定义的键值结构。最常用的是
JSON
(application/json
),也可以是纯文本 (text/plain
)、XML (application/xml
) 甚至是一段自定义格式。-
Content-Type: 明确指定你塞进去的是什么,比如
application/json
,text/xml
。 -
数据样子 (JSON):
json{ "username": "张三", "age": 30, "hobbies": ["coding", "reading"] }
-
二、什么时候该用谁?
-
请用 FormData:
- 上传文件/图片: 这是它的主场!无论是单文件还是多文件,配合
<input type="file">
或FormData
API 轻松搞定。 - 传统表单提交: 需要兼容老系统或者就是简单的键值对提交(且可能包含文件)时。
- 上传文件/图片: 这是它的主场!无论是单文件还是多文件,配合
-
请用 Raw (通常是 JSON):
- API 交互 (RESTful API): 现代 Web API 和移动端 API 通信的绝对主力。结构清晰、灵活表达复杂嵌套数据。
- 提交结构化数据: 当你需要传递一个对象、数组等复杂数据结构时,JSON 的层次化表示比扁平的键值对强大得多。
- 需要明确数据类型: JSON 天生区分字符串、数字、布尔值、数组、对象、
null
,后端解析更精准。
三、总结
特性 | FormData (multipart/form-data) | Raw (常用 application/json) |
---|---|---|
主要用途 | 文件上传、传统表单提交 | API 交互 、传递结构化数据 |
数据格式 | 键值对 + 分隔符 (含文件二进制) | 原始文本 (常用 JSON, XML, 纯文本等) |
Content-Type | multipart/form-data |
application/json , text/plain 等 |
数据结构灵活性 | 扁平 (键值对),处理复杂结构较麻烦 | 高 (JSON 天然支持对象、数组嵌套) |
数据大小效率 | 有 boundary 开销,传大文件效率高 | 纯文本数据更紧凑,文件处理复杂 |
简单口诀:
- 要传文件? 无脑选
FormData
(multipart/form-data
)。 - 做 API (尤其是复杂数据)? 首选
Raw JSON
(application/json
)。 - 普通表单没文件?
FormData
(application/x-www-form-urlencoded
更轻量,都可以,看你们则呢么选择或者约定。