javascript - 关于 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 不适合直接传输二进制数据?将图像或音频文件传输到前端的一些常见做法是什么?
解决方案
您引用的那一行是关于仅使用 ASCII 的起始行、状态行和标题。
请求或响应的主体是任意字节序列。它主要由应用程序解释,而不是由 HTTP 层解释。它不需要采用任何特定的编码。标头有一个Content-Length
字段,客户端只需在标头之后读取那么多字节(还有分块编码,它将内容分成块,但每个都以字节长度开头,客户端只需将它们连接起来)。
此外,HTTP 包括Transfer-Encoding
指定数据编码的类型。这包括许多产生二进制数据的压缩格式。
虽然可以使用诸如 base64 之类的文本编码,但这通常不会在 HTTP 中完成,因为它会增加消息的大小并且没有必要。
推荐阅读
- docker - 如何在 CI 构建期间减少 docker pull 时间?
- python - 克服 SSL:使用 urllib3 时 Windows 10 上的 CERTIFICATE_VERIFY_FAILED
- css - 大边框大小的问题(不是完整的矩形)
- r - 返回矩阵每列 N 最小值/最大值的索引行数
- jdbc - 如何使用 H2 数据库设置 CharacterEncoding?
- django - 分配前引用的 Django 局部变量“表单”
- java - 单击通知历史记录时如何更改cardview的背景颜色?
- dolphindb - 在 DolphinDB 中使用随机种子
- python - matplotlib.path.contains_points 如何与 PolygonSelector 交互?
- c# - 如何创建自己的自定义 jsonhandler 来处理“MaxJsonDeserializerMembers”