原文: What is the Correct Content-Type for JSON? Request Header Mime Type Explained

互联网上使用的每个资源都有一个媒体类型,也被称为 MIME 类型,意思是 Multipurpose Internet Mail Extension 多用途互联网邮件扩展。这些信息对于服务器和客户端之间的通讯是必要的。

浏览器需要知道发送给它的资源的媒体类型,以便它能够正确地处理它们。

服务器也是如此。它需要知道发送给它的资源的类型,以便进行准确的解析和处理。

内容类型是在哪里声明的?

任何资源的媒体类型都在请求头(在客户端,当向服务器发出请求时)的 Content-Type 属性或响应头(在服务器,当发送响应时)中声明。

如果不明确声明资源的内容类型,客户端可能试图自动检测类型,但结果可能不准确,所以明确声明它是很重要的。

媒体类型

媒体类型以各种形式存在。它们被划分为不同的组别:

  • 应用
  • 音频
  • 字体
  • 例子
  • 图像
  • 信息
  • 模型
  • 多部分
  • 文本
  • 视频

这些类别也有其类型。例如,application/jsonapplication 下的一个类型,text/htmltext 下的一个类型。

你可以在 IANA(一个协调互联网上一些关键元素的主体)媒体类型中找到一个完整的媒体类型列表。

所有这些类型涵盖了各种数据类型,如文本、音频、图像、HTML,以及更多在互联网上使用的类型。

浏览器需要知道一个资源的媒体类型

正如我上面提到的,浏览器需要知道它收到的内容是什么类型。这里有一个例子可以说明这一点。

下面的代码是一个用于 HTML 文件的 Node 服务器:

const http = require("http");
const fs = require("fs");
const path = require("path");

const server = http.createServer(function (req, res) {
	const filePath = path.join(__dirname, "index.html");
	var stat = fs.statSync(filePath);

	res.writeHead(200, {
		"Content-Type": "text/css",
		"Content-Length": stat.size,
	});

	const readStream = fs.createReadStream(filePath);
	readStream.pipe(res);
});

server.listen(5000);

console.log("Node.js web server at port 5000 is running..");

不要担心代码的具体细节。你所关心的只是我们正在提供的 index.html 文件,以及内容类型是 text/css

下面是 index.html 的内容:

<h1>Homepage</h1>

当然,HTML 文档与 CSS 文件是不同的。下面是服务器启动时在 localhost:5000 上的结果。

Screenshot-2020-12-08-at-10.12.32

你也可以通过检查 DevTools 的 network 标签中的 header 信息来确认得到的响应。

下面是在 Chrome 浏览器上的结果:

Screenshot-2020-12-08-at-10.13.34

浏览器得到的内容是一种 CSS 类型,因此,它试图将其作为 CSS 处理。

另外,请注意,完全了解浏览器得到的内容类型也会减少安全漏洞,因为浏览器知道要为这些数据制定的安全标准。

现在你了解了 MIME 类型的概念和它们的重要性,让我们来看看 JSON。

正确的 JSON 内容类型

JSON 必须被浏览器正确解释才能被适当使用。text/plain 通常用于JSON,但根据 IANA,JSON 的官方 MIME 类型是 application/json

这意味着当你向服务器发送 JSON 或从服务器接收 JSON 时,你应该始终将 header 的内容类型声明为 application/json,因为这是客户端和服务器理解的标准。

总结

如上所述,服务器(就像浏览器一样)需要知道发送给它的数据类型,例如,在一个 POST 请求中。这就是为什么带有文件的 forms 通常包含 enctype 属性,其值为 multipart/form-data

如果不以这种方式对请求进行编码,POST 请求就不会工作。另外,一旦服务器知道它得到的数据类型,它就知道如何解析编码后的数据。

在这篇文章中,我们看了什么是 MIME 类型以及它们的用途。此外,我们还看了 JSON 的内容类型。我希望你现在知道为什么在互联网上使用时声明资源类型很重要。