首页 > 解决方案 > 关于 HTTP 传输非文本(二进制)数据的困惑

问题描述

我在看这个 MDN 教程https://developer.mozilla.org/en-US/docs/Web/HTTP/Messages 它说

HTTP 消息由以 ASCII 编码的文本信息组成。

我认为这意味着 HTTP 只能传输文本信息,也就是字符串,假设这里的 HTTP 消息是指响应中的标头 + 正文。

但后来我发现 HTTP 响应正文可以有多种 MIME 类型,例如图像、视频、应用程序/json 等。这是否意味着 HTTP 也可以传输非文本信息,这与 MDN 页面所说的相矛盾关于 HTTP 消息?

我知道像 utf-8 和 base64 这样的编码方法,我想您可以对二进制数据使用 Base64 编码,以便将其转换为文本 - 然后可以使用 application/json 内容类型作为 JSON 的另一个属性发送有效载荷。但是当您选择不进行编码时,而是使用正确content-type的,您可以只传输二进制数据吗?我仍在努力解决这个问题。

我也有一些从前端使用 REST API 的经验。我的印象是,您通常不会使用 RESTful API 传输任何二进制数据,例如图像、文件、音频。它们通常提供 JSON 或 XML 作为响应。我想知道这是为什么?是不是因为 REST API 不适合直接传输二进制数据?将图像或音频文件传输到前端的一些常见做法是什么?

标签: javascriptjsonhttpnetworkingbase64

解决方案


您引用的那一行是关于仅使用 ASCII 的起始行、状态行和标题。

请求或响应的主体是任意字节序列。它主要由应用程序解释,而不是由 HTTP 层解释。它不需要采用任何特定的编码。标头有一个Content-Length字段,客户端只需在标头之后读取那么多字节(还有分块编码,它将内容分成块,但每个都以字节长度开头,客户端只需将它们连接起来)。

此外,HTTP 包括Transfer-Encoding指定数据编码的类型。这包括许多产生二进制数据的压缩格式。

虽然可以使用诸如 base64 之类的文本编码,但这通常不会在 HTTP 中完成,因为它会增加消息的大小并且没有必要。


推荐阅读