【问题标题】:When exchanging data between a browser and a server, the data can only be text. Why?在浏览器和服务器之间交换数据时,数据只能是文本。为什么?
【发布时间】:2019-05-24 05:25:24
【问题描述】:

我理解为什么我们使用 JSON 代替 XML 在浏览器和服务器之间交换数据,但我不明白为什么我们只使用字符串类型的 JSON,即使我们有六种不同的值数据类型,我的意思是为什么我们不能使用整数或布尔值或任何其他值数据类型。 希望你们能理解我的意思,提前谢谢。

【问题讨论】:

  • 您应该能够使用 JSON 发送布尔值或数值。但要求是请求需要转换为纯文本,因为 HTTP 用于通信,这是设计上基于文本的协议。
  • 澄清一下:你不明白为什么 HTTP 负载是文本,或者你认为即使使用 JSON,你也只能使用 JSON 文本值,而不是 JSON 布尔值等?

标签: javascript html json http


【解决方案1】:

如果我理解正确,限制是因为需要对数据进行编码以通过 HTTP 并最终通过网络发送。您的 json 对象(或 xml 等)最终只是 HTTP 的有效负载(这只是 tcp 的有效负载,依此类推)。

HTTP 本身不会也不应该识别有效负载中的数据类型,它只是 HTTP 的一个数组。您可以选择如何表示这个数组,即如何编码它;它可以是字符串(ascii、utf-8 等)或二进制文件,但对于整个有效负载来说必须是统一的。

HTTP 确实提供了不同的有效负载编码方法,接收方可以通过查看 content-type 标头来解释这些方法并相应地解码数据。

希望这会有所帮助。

【讨论】:

  • 首先非常感谢您的宝贵回答....但我还有一个疑问,例如为什么我们需要以单一格式发送,所有其他不同格式有什么问题?
  • 让我试着用一个比喻来解释。考虑 javascript(或任何其他语言)中的代码 sn-p。代码本身可以具有不同类型的逻辑结构和变量。但是代码本身必须以纯文本格式存储(编码)。当您传输包含代码的文件时,例如从您的 PC 到另一台,它本质上是一个文本文件传输。希望这能说明问题。
【解决方案2】:

为什么我们只使用字符串类型的 JSON

嗯,我们不是。我相信你在这里误解了一些东西。 HTTP 响应实际上可以包含任何内容;每次您从 Web 服务器下载 PDF 或图像时,Web 服务器都会发送二进制有效负载,它实际上可以是任何东西。因此,所有 HTTP 正文都必须是文本甚至不是真的。

要在系统之间交换数据,您需要发送字节。要使这些字节有意义,您需要一个编码方案。图像格式具有需要排列字节的特定方式,如果这样做正确,您可以使用它们发送图片。 PDF、视频、音频和其他任何内容(包括文本)也是如此。

如果您想发送结构化数据,您需要以某种方式表达该结构。例如,您如何通过 HTTP 发送 PHP 数组……? (用您选择的语言替换您的等效列表数据结构。)您不能。 PHP 数组是 PHP 运行时内存中的特定数据结构,通过 HTTP 按原样发送没有意义(因为它处理内部指针等)。这个数组需要首先被序列化。有许多可能的序列化方法,其中一些使用二进制数据,还有一些使用人类在不同程度上可读的格式。您可以简单地将所有数组元素用逗号和.split(',') 在另一端再次连接起来,但这相当简单,并且会遗漏许多更复杂的情况和边缘情况。

JSON 和 XML(以及 YAML 和诸如此类)是人类可读的格式,它们可以序列化数据结构,如数组(以及字典、数字和布尔值等),并且恰好是基于文本的(目的是使它们对开发人员友好)。您可以使用 JSON 允许的任何数据类型。没有什么能阻止你这样做,不使用它们是疯狂的。 JSON 和 XML 也恰好是两种格式,可以使用每个浏览器中内置的工具轻松解析。您也可以使用任何其他二进制格式,但是您必须在 Javascript 中手动解析它。

【讨论】:

    【解决方案3】:

    浏览器和服务器之间的通信可以通过多种方式完成。只是 JSON 开箱即用。你可以使用 protobuf、xml 和其他大量的数据序列化技术与服务器进行通信,只要双方都了解通信介质是什么。在浏览器端,您可能必须在 javascript 中自己实现 protobuf、xml 等序列化/反序列化。

    允许任何有效的 JSON 进行数据交换。键是用字符串引用的,但值可以是字符串、数字、布尔值、数组或其他对象本身。虽然在传输之前,所有内容都被转换为字符串,接收方将其解析为正确的格式。

    【讨论】:

      猜你喜欢
      • 2011-01-13
      • 1970-01-01
      • 2015-05-16
      • 2018-06-30
      • 2018-06-21
      • 2022-01-21
      • 1970-01-01
      • 1970-01-01
      • 2013-02-09
      相关资源
      最近更新 更多