首页 > 解决方案 > application/x-www-form-urlencoded 和 multipart/form-data 是客户端在向服务器发送数据时唯一处理的两种特殊内容类型吗?

问题描述

我曾经搜索和阅读与该主题相关的帖子,但现在我又有点困惑了。

和以前一样,我阅读了很多帖子,但仍然没有看到任何帖子清楚地阐明当客户端向服务器发送数据时这些不同的内容类型将如何影响或操纵客户端的数据。


所以这是我的理解(假设它是一种POST方法):

  1. 有 2 种内容类型是特殊的,并且与其他内容类型不同。
    application/x-www-form-urlencodedmultipart/form-data

    • application/x-www-form-urlencoded客户端的数据以某种方式被编码(更改)。
    • multipart/form-data客户端将使用称为boundary分隔符的东西。结果,客户端可以在一个请求中一起发送许多东西,并boundary插入一些字符串作为分隔符。
  2. 对于客户端( )指定的所有其他内容类型xmlhttp.setRequestHeader,例如application/json, application/pdf, application/image, application/octet-streamblablabla ,客户端不会更改任何内容,只是将原始(二进制)数据放入 http 请求正文并将其发送到服务器。服务器可以从 http 请求正文中检索原始数据并做任何它想做的事情。

我的理解/分类是否正确?


通过说“客户端”,我主要指的是浏览器。

通过说“服务器”,我的意思是服务器框架或应用程序。

因为如果我理解正确,Web 服务器(例如 Nginx 或 Apache)不会对数据做任何事情。他们只是将数据传递给连接到他们的服务器端应用程序。

标签: javascripthttp

解决方案


有 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。

推荐阅读