SOAP、XML-RPC、RPC 等通过在 HTTP 上运行来增加 Web 服务和远程调用的标准。但是这些技术也带来了不少问题,例如过于复杂、难以缓存、性能瓶颈等。
RESTful 成了近年来 Web 服务的一种很流行的架构风格。以 Representational State Transfer(表现层状态转移)为基础,它使用 HTTP 协议中的 GET、POST、PUT、DELETE 等动词,将 URL 作为资源的标识,使用表现层来区分资源的状态和资源的具体表现形式,从而保证系统的灵活性和可扩展性。
RESTful API 的主要设计区别于 SOAP 和其他 Web 服务,它通过以下四个方面来实现:
- 使用有意义的 HTTP 方法;
- 将资源标识符 (URIs) 明确
- 资源通过 MIME 类型(例如 text/html, application/xml, application/json)进行通信;
- 增加 HATEOAS 组成部分,使得客户端无需知道服务器上 API 的详细架构,客户端只需要按照超媒体(Hypermedia)提供的链接(Link)访问即可。
下面将分析 RESTful API 设计中 HATEOAS 的定义与标准,并提供实际案例说明。
什么是 HATEOAS?
HATEOAS(超文本传递引擎驱动的 Web 应用程序) 是 RESTful 架构风格的一种约束条件。它要求服务器在响应客户端请求时,除了资源数据之外,还需要返回关于如何使用 API(如何访问 API)的信息,使客户端可以根据该信息自行发现和关联相应的 API 资源,从而更加简化客户端与服务器的耦合。
HATEOAS 是 RESTful 架构风格的一个重要约束, 它必须得满足以下两个要求:
- 资源间的链接是通过响应内容链接而建立的。
- 所有链接的操作,必须被服务器明确表示,不能由客户端假定潜在的操作。
HATEOAS 的标准实现
目前针对 HATEOAS 的标准实现有两类:HAL 和 Siren。
HAL
HAL 是 Hypertext Application Language(超文本应用语言)的缩写。它是基于 JSON 的数据格式,包含一个链接对象,链接对象包含一个数组。
_links
:它包含若干个链接对象,每个链接对象包含一个 HREF 属性和若干个属性值,主要描述当前实体对象与其他实体对象的关系。_embedded
:用于嵌套其他 HAL 资源。
以下是 HAL 的示例代码:
-- -------------------- ---- ------- - --------- - ------- - ------- ------------- -- --------- - ------- --------- - -- -------- ------ ------------ - ------------ - - --------- - ------- - ------- --------------- -- ---------- - ------- ------------- - -- ------- ----------- ----------- --- -------- ---- -- - --------- - ------- - ------- --------------- -- ---------- - ------- ------------- - -- ------- ----------- ----------- --- -------- ---- - - - -
Siren
Siren 是目前另一种 HATEOAS 表示方式,它不像 HAL 那样基于 JSON,而是一种自描述的超媒体格式。Siren 是基于链接的表示,每个资源都是包含一个实体和链接列表,链接列表提供了对资源状态变更的支持。
以下是 Siren 的示例代码:
-- -------------------- ---- ------- - -------- - ------- -- ------------- - -------- ----- -- ----------- - - -------- --------- ------ ------------------- ------------- - ------- ----------- ----------- --- -------- ---- -- -------- - - ------ --------- ------- --------------- -- - ------ ------------ ------- ------------- - - -- - -------- --------- ------ ------------------- ------------- - ------- ----------- ----------- --- -------- ---- -- -------- - - ------ --------- ------- --------------- -- - ------ ------------ ------- ------------- - - - -- -------- - - ------ - ------ -- ------- ------------- -- - ------ - -------- -- ------- --------- - - -
HATEOAS 的实际案例
HATEOAS 可以在设计和实现 RESTful API 时提供很多好处。以下是一些常见的案例说明:
列表
如果要返回一个列表,可以提供以下超媒体控制:
-- -------------------- ---- ------- - -------- - ------- --------------------------------- ------- --------------------------------------- -- -------- - - ------- ----------------------------------- ------- ------- --- -------- ------- -- - ------- ----------------------------------- ------- ------- --- -------- ------- - - -
CRUD 操作
一个资源的 CRUD 操作可以分别表示为以下四个动作:
- 获取资源列表的链接。
- 获取资源详细信息的链接。
- 更新资源的链接。
- 删除资源的链接。
以下是 User 的示例代码:
-- -------------------- ---- ------- - -------- - ------- - ------- --------------------------------------- --------- ----- -- ---------- - ------- ------------------------------- --------- ------- ------- ------------------- --------- - --- - -- ------- - ------- --------------------------------------- --------- ------ ------- ------------------- --------- - --- - -- --------- - ------- --------------------------------------- --------- --------- ------- ------------------ - -- ------- - ----------- ---------- -------- ---------------------- ------------- ------- ------------ ----- - -
HATEOAS 的指导意义
HATEOAS 是 RESTful API 的重要组成部分,它可以使得客户端不需要知道服务器上 API 的详细架构,客户端只需要按照超媒体提供的链接(Link)访问即可。同时,HATEOAS 可以为 API 提供更好的可扩展性和灵活性,使得客户端与服务器之间的耦合降低,潜在的操作也更加明确。
在设计和实现 RESTful API 时,应该尽可能地遵循 HATEOAS 的约束。要确保在 API 完整响应中包含必要的链接关系,为客户端提供更加清晰的操作路线。
结论
本文从 RESTful API 设计的基础和 HATEOAS 的定义入手,详细介绍了 HATEOAS 在 RESTful API 架构风格中的应用和实现。同时,提供了 HAL 和 Siren 两种实际例子,以帮助读者理解和实践 HATEOAS 相关技术。
在设计和实现 RESTful API 时,我们应该充分考虑 HATEOAS 的约束,提供清晰的链接关系,为客户端提供更加明确的操作路线,从而提高 API 的可扩展性和灵活性。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/672cba28ddd3a70eb6d919cd