HTTP传输非文本(二进制)数据的困惑



我正在看这个MDN教程https://developer.mozilla.org/en-US/docs/Web/HTTP/Messages这里写着

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

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

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

我知道像utf-8和base64这样的编码方法,我猜你可以使用base64编码二进制数据,这样它就可以转换成文本-然后可以用应用程序/json内容类型作为json有效负载的另一个属性发送。但是当你选择不进行编码,而是使用正确的content-type时,你可以只传输二进制数据?我还在想办法。

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

你引用的行是关于起始行、状态行和头,它们只使用ASCII。

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

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

虽然可以使用像base64这样的文本编码,但在HTTP中通常不这样做,因为这会增加消息的大小,而且没有必要。

最新更新