javascript - application/x-www-form-urlencoded 和 multipart/form-data 是客户端在向服务器发送数据时唯一处理的两种特殊内容类型吗?
问题描述
我曾经搜索和阅读与该主题相关的帖子,但现在我又有点困惑了。
和以前一样,我阅读了很多帖子,但仍然没有看到任何帖子清楚地阐明当客户端向服务器发送数据时这些不同的内容类型将如何影响或操纵客户端的数据。
所以这是我的理解(假设它是一种POST
方法):
有 2 种内容类型是特殊的,并且与其他内容类型不同。
application/x-www-form-urlencoded
和multipart/form-data
。- ,
application/x-www-form-urlencoded
客户端的数据以某种方式被编码(更改)。 - ,
multipart/form-data
客户端将使用称为boundary
分隔符的东西。结果,客户端可以在一个请求中一起发送许多东西,并boundary
插入一些字符串作为分隔符。
- ,
对于客户端( )指定的所有其他内容类型
xmlhttp.setRequestHeader
,例如application/json
,application/pdf
,application/image
,application/octet-stream
blablabla ,客户端不会更改任何内容,只是将原始(二进制)数据放入 http 请求正文并将其发送到服务器。服务器可以从 http 请求正文中检索原始数据并做任何它想做的事情。
我的理解/分类是否正确?
通过说“客户端”,我主要指的是浏览器。
通过说“服务器”,我的意思是服务器框架或应用程序。
因为如果我理解正确,Web 服务器(例如 Nginx 或 Apache)不会对数据做任何事情。他们只是将数据传递给连接到他们的服务器端应用程序。
解决方案
有 2 种内容类型是特殊的,并且与其他内容类型不同。
不,HTML 表单支持这 2 种内容类型(text/plain
这是毫无意义的,您永远不应该使用)。
使用 application/x-www-form-urlencoded,客户端的数据以某种方式被编码(更改)。
对于常规的 HTML 表单,所有编码都会以某种方式更改数据(即使它是text/plain
“让一切成为name=value
现实并在每个项目之间插入新行)。
使用 multipart/form-data,客户端将使用称为边界的东西作为分隔符。
是的。text/plain
使用新行。application/x-www-form-urlencoded
使用&
. 一切都有一个分隔符。(您只是无法将分隔符与数据中的新行分开,text/plain
这使它无用)。
结果,客户端可以在一个请求中一起发送许多东西,并插入一些边界字符串作为分隔符。
客户端可以使用这三种编码中的任何一种发送许多东西。
不同的是 multipart 支持文件。
Multipart 允许您将标题放在每个部分的数据之前,因此您可以包含文件名和内容类型等对支持文件几乎必不可少的内容。
对于客户端指定的所有其他内容类型 (xmlhttp.setRequestHeader),例如 application/json、application/pdf、application/image、application/octet-stream blablabla,客户端不会更改任何内容,只是将原始 (二进制)数据在http请求正文中并将其发送到服务器。
显式设置内容类型不会影响XMLHttpRequest
对象将如何处理您传递给的内容send()
。
如果您传递一个字符串,它不会以任何方式对其进行编码(因此您需要自己将数据编码到字符串中,并为您选择的编码设置正确的内容类型标头)。如果你传递一个FormData
对象,那么它将把它编码为多部分。等等
因为如果我理解正确,Web 服务器(例如 Nginx 或 Apache)不会对数据做任何事情。他们只是将数据传递给连接到他们的服务器端应用程序。
一般情况下都是这样,但有些过于简单化了。例如,如果使用在 Node.js 上运行的 Express.js 编写,则服务器和服务器端应用程序之间可能没有区别。
概括
- 表单总是对数据进行编码。该
enctype
属性告诉他们以哪种方式进行操作。 XMLHttpRequest
并且fetch
可以对数据进行编码,但这取决于您传递给它们的值类型。如果是字符串,则必须对其进行编码并自己设置正确的 Content-Type。
推荐阅读
- javascript - 如何向 Feed 和可查看的 Profile ReactJS 提交信息
- wcf - Shopify 与 Newtonsoft (JSON.NET) 问题
- ios - 如何在快速日期字符串中使用破折号(“-”)?
- javascript - JS React Native / Expo 中的可选要求
- arrays - 列中当前值的计数
- javascript - 如何防止 jQuery click 事件同时在多个元素上触发?
- javascript - 剑道参数映射返回未定义
- ios - 使用 VNRectangleObservation 裁剪 UIImage
- python - 如何在 Beautifulsoup 4 中检索包含特定文本的 href?
- python - 只是想比较一个项目但得到一个 UndefinedVariableError