关于 HTTP 传输 non-text(二进制)数据的困惑
Confusion about HTTP transferring non-text (binary) data
我在看这个 MDN 教程 https://developer.mozilla.org/en-US/docs/Web/HTTP/Messages
它说的是
HTTP messages are composed of textual information encoded in ASCII.
我认为这意味着 HTTP 只能传输文本信息也就是字符串,假设这里的 HTTP 消息在响应中指的是 header + body。
但是后来发现HTTP响应body可以有多种文本之外的MIME类型,比如图片,视频,application/json等等,那岂不是HTTP也可以传输non-textual 信息,这与 MDN 页面关于 HTTP 消息的说法相矛盾?
我知道 utf-8 和 base64 等编码方法,我想您可以对二进制数据使用 Base64 编码,以便将其转换为文本 — 然后可以使用 application/json 内容发送输入 JSON 负载的另一个 属性。但是当你选择不进行编码,而是使用正确的 content-type
时,你可以只传输二进制数据吗?我还在想办法解决这个问题。
我也有一些从前端使用 REST API 的经验。我的印象是您通常不传输任何二进制数据,例如具有 RESTful API 的图像、文件、音频。他们通常将 JSON 或 XML 作为响应。我想知道这是为什么?是因为 REST API 不适合直接传输二进制数据吗?将图像或音频文件传输到前端有哪些常见做法?
您引用的行是指起始行、状态行和 headers,它们仅使用 ASCII。
请求或响应的 body 是任意字节序列。它主要由应用程序解释,而不是由 HTTP 层解释。它不需要采用任何特定的编码。 header 有一个 Content-Length
字段,客户端简单地读取 header 之后的那么多字节(还有 chunked 编码,这会破坏内容分成块,但每个块都以字节长度开头,客户端只是将它们连接起来)。
此外,HTTP 包括 Transfer-Encoding
类型,用于指定数据的编码。这包括许多生成二进制数据的压缩格式。
虽然可以使用 base64 等文本编码,但在 HTTP 中通常不会这样做,因为它会增加消息的大小而且没有必要。
我在看这个 MDN 教程 https://developer.mozilla.org/en-US/docs/Web/HTTP/Messages 它说的是
HTTP messages are composed of textual information encoded in ASCII.
我认为这意味着 HTTP 只能传输文本信息也就是字符串,假设这里的 HTTP 消息在响应中指的是 header + body。
但是后来发现HTTP响应body可以有多种文本之外的MIME类型,比如图片,视频,application/json等等,那岂不是HTTP也可以传输non-textual 信息,这与 MDN 页面关于 HTTP 消息的说法相矛盾?
我知道 utf-8 和 base64 等编码方法,我想您可以对二进制数据使用 Base64 编码,以便将其转换为文本 — 然后可以使用 application/json 内容发送输入 JSON 负载的另一个 属性。但是当你选择不进行编码,而是使用正确的 content-type
时,你可以只传输二进制数据吗?我还在想办法解决这个问题。
我也有一些从前端使用 REST API 的经验。我的印象是您通常不传输任何二进制数据,例如具有 RESTful API 的图像、文件、音频。他们通常将 JSON 或 XML 作为响应。我想知道这是为什么?是因为 REST API 不适合直接传输二进制数据吗?将图像或音频文件传输到前端有哪些常见做法?
您引用的行是指起始行、状态行和 headers,它们仅使用 ASCII。
请求或响应的 body 是任意字节序列。它主要由应用程序解释,而不是由 HTTP 层解释。它不需要采用任何特定的编码。 header 有一个 Content-Length
字段,客户端简单地读取 header 之后的那么多字节(还有 chunked 编码,这会破坏内容分成块,但每个块都以字节长度开头,客户端只是将它们连接起来)。
此外,HTTP 包括 Transfer-Encoding
类型,用于指定数据的编码。这包括许多生成二进制数据的压缩格式。
虽然可以使用 base64 等文本编码,但在 HTTP 中通常不会这样做,因为它会增加消息的大小而且没有必要。