📔3. 数据格式
作者:Bryan Cooksey 发布日期:2014年4月22日
到目前为止,我们已经学到了HTTP(超文本传输协议)是Web上API的基础,并且要使用它们,我们需要了解HTTP的工作原理。在本章中,我们将探讨API提供的数据,它的格式以及HTTP是如何实现这一点的。
表示数据
当与人们共享数据时,展示信息的可能性仅受人类想象力的限制。回想一下上一章的比萨店-他们可能如何格式化他们的菜单呢?它可以是纯文本的项目列表,也可以是带有标题的一系列照片,甚至可以只是照片,外国顾客可以指着照片来下订单。
一个良好设计的格式取决于使目标受众最容易理解信息的方式。
在计算机之间共享数据时也适用同样的原则。一个计算机必须将数据以另一个计算机能理解的格式进行编码。通常,这意味着一种文本格式。现代API中最常见的格式是JSON(JavaScript对象表示法)和XML(可扩展标记语言)。
JSON
许多新的API采用JSON作为格式,因为它是基于流行的JavaScript编程语言构建的,该语言在Web上无处不在,并可用于Web应用程序或服务的前端和后端。JSON是一种非常简单的格式,它有两个部分:键和值。键表示被描述对象的属性。比萨订单可以是一个对象。它有属性(键),如面团类型、配料和订单状态。这些属性有相应的值(厚面团、意大利辣香肠和正在派送中)。
让我们看看这个比萨订单在JSON中是什么样子:

在上面的JSON示例中,键是左边的单词:toppings、crust和status。它们告诉我们比萨订单包含的属性。值是右边的部分。这些是订单的实际细节。

如果你从左到右读一行,你会得到一个相当自然的英语句子。以第一行为例,我们可以将其读作:“这个比萨的面饼是原味风格。”第二行也可以被读取-在JSON中,以方括号([])开始和结束的值是一个值列表。因此,我们可以将订单的第二行读作:“这个订单的配料是:奶酪、意大利辣香肠和大蒜。”
有时,你想要将一个对象作为键的值。让我们扩展我们的比萨订单,加上顾客的详细信息,这样你就可以看到这可能是什么样子了:

在这个更新的版本中,我们可以看到添加了一个新的键“customer”。这个键的值是另一组键和值,提供了关于下订单的顾客的详细信息。酷吧?!这被称为关联数组。不过不要被这个技术术语吓到-关联数组只是一个嵌套的对象。
XML
XML自1996年以来就存在了。随着时间的推移,它已经成为一种非常成熟和强大的数据格式。与JSON类似,XML提供了一些简单的构建块,API制作者用来组织他们的数据。主要的构建块被称为节点。
让我们看看我们的比萨订单在XML中可能是什么样子的:

XML总是以一个根节点开始,在我们的比萨示例中是“order”。在订单内部还有更多的“子”节点。每个节点的名称告诉我们订单的属性(就像JSON中的键),而节点内部的数据则是实际的细节(就像JSON中的值)。

你可以通过阅读XML来推断出英语句子。看一下带有“crust”的行,我们可以读作:“这个比萨的面饼是原味风格。”请注意,在XML中,配料列表中的每个项目都被一个节点包裹。你可以看到XML格式需要更多的文本来进行通信,而不像JSON那样简洁。
数据格式在HTTP中的使用方式
现在我们已经探索了一些可用的数据格式,我们需要知道如何在HTTP中使用它们。为了做到这一点,我们将再次向HTTP的基本原理打招呼:头部。在第二章中,我们学到头部是关于请求或响应的信息列表。有一个头部用于指定数据的格式:Content-Type。
当客户端在请求中发送Content-Type头部时,它告诉服务器请求体中的数据以特定的方式进行格式化。如果客户端想要发送JSON数据给服务器,它将设置Content-Type为“application/json”。服务器在接收到请求并看到Content-Type后,首先会检查是否理解该格式,如果是的话,它将知道如何读取数据。同样地,当服务器向客户端发送响应时,它也会设置Content-Type来告诉客户端如何读取响应体。
有时,客户端只能使用一种数据格式。如果服务器发送的格式与该格式不同,客户端将失败并抛出错误。幸运的是,第二个HTTP头部来拯救了。客户端可以设置Accept头部来告诉服务器它能够接受哪些数据格式。如果客户端只能使用JSON,它可以将Accept头部设置为“application/json”。服务器将以JSON格式发送其响应。如果服务器不支持客户端请求的格式,它可以向客户端发送错误,告诉它请求无法工作。
通过这两个头部,Content-Type和Accept,客户端和服务器可以使用它们理解和需要的数据格式来正常工作。

第三章回顾
在本章中,我们学到了为了让两台计算机进行通信,它们需要能够理解传递给它们的数据格式。我们介绍了API使用的两种常见数据格式,JSON和XML。我们还学到了Content-Type HTTP头部是一种指定请求中发送的数据格式的有用方式,而Accept头部则指定了响应的请求格式。
我们学到的关键词有:
JSON:JavaScript对象表示法
对象(Object):一个事物或名词(人、比萨订单...)
键(Key):关于对象的属性(颜色、配料...)
值(Value):属性的值(蓝色、意大利辣香肠...)
关联数组(Associative array):一个嵌套的对象
XML:可扩展标记语言
接下来
在下一章中,我们将了解两台计算机如何使用身份验证建立信任,以便传递敏感数据,如顾客详细信息或私人内容。
最后更新于