RESTful API 是现代应用程序开发的一种标准接口设计方式,其核心是将多个独立的资源以统一的 URL 统一起来,并提供 GET、POST、PUT、DELETE 等方法进行操作。RESTful API 的一个重要特点是,它可以通过使用超媒体(HATEOAS)来提高 API 的可用性,本文将介绍如何使用 HATEOAS 来构建更好的 RESTful API。
HATEOAS 的概念
HATEOAS (Hypermedia as the Engine of Application State) 是 RESTful API 设计中实现可扩展性和可用性的一种方式。它允许 API 的客户端在与服务器交互时能够发现可以执行的操作,而无需硬编码特定的 URL。 HATEOAS 通过在 API 中添加超媒体来实现,这些超媒体包含了当前资源的相关链接,以及执行其他相关操作的链接(如下一页、前一页等)。
HATEOAS 的使用
下面我们以一个简单的Todo应用为例,来说明如何在API中使用HATEOAS,首先我们需要将我们的Todo资源设计成一个RESTful API,如下所示:
GET /todos - 返回所有的Todo列表 POST /todos - 创建一个新的Todo GET /todos/{id} - 返回id为{id}的Todo PUT /todos/{id} - 更新id为{id}的Todo DELETE /todos/{id} - 删除id为{id}的Todo
然后,我们需要在返回响应中添加超媒体。例如,在返回单个 Todo 的响应中,我们可以添加一个包含所有 Todo 的链接列表,并添加“上一页”、“下一页”等操作:
-- -------------------- ---- ------- - ----- -- -------- ---- ----------- ------------ ------ --------- - ------- - ------- ---------- -- ------- - ------- -------- -- --------- - ------- ----------- --------- ----- -- --------- - ------- ----------- --------- -------- -- ------- - ------- ----------- --------- ----- -- ------- - ------- ----------- --------- ----- - - -
在这个响应中,我们添加了一个 _links
属性,它包含了 self
、list
、update
、delete
、prev
和 next
链接。这些链接包含了操作的 URL,以及运行该操作的方法类型。客户端可以使用这些链接来发现可以执行的操作。
我们还可以在其他响应中添加其他链接。例如,在返回所有 Todo 的响应中,我们可以添加一个链接,允许客户端创建新的 Todo:
-- -------------------- ---- ------- - --------- - ------- - ------- -------- -- --------- - ------- --------- --------- ------ - -- ------------ - -------- - - ----- -- -------- ---- ----------- ------------ ----- -- - ----- -- -------- ----- --- ------- ------------ ---- -- - ----- -- -------- --- --------- ------------ ----- - - - -
在这个响应中,我们添加了一个名为 create
的链接,它允许客户端创建新的 Todo。
如何实现 HATEOAS
实现一个 HATEOAS 的 RESTful API 并不难。首先,需要确定我们需要提供哪些链接。通常,以下链接是必要的:
self
- 指向当前资源的 URLlist
- 指向包含当前资源的列表的 URLcreate
- 指向创建新资源的 URLupdate
- 指向更新当前资源的 URLdelete
- 指向删除当前资源的 URLprev
- 指向上一页next
- 指向下一页
然后,我们需要在服务器中实现这些链接。在使用 Express.js 的 Node.js 服务器中,可以通过以下方式实现 _links
属性:
-- -------------------- ---- ------- ----- ------------------ - ---------- -- - --------------- - - ----- - ----- --------------------------- -- ----- - ----- ------------ -- ------- - ----- ------------- ------- ------ -- ------- - ----- ---------------------------- ------- ----- -- ------- - ----- ---------------------------- ------- -------- - -- ------ --------- -- -- ------- ----- ------------------------- ----- ---- -- - ----- ---- - --------------------------- ----------------------------------- ---
上面的代码在返回 Todo 数据之前,调用 addLinksToResource
函数为其添加 _links
属性。在客户端上,我们可以将响应数据存储在变量中,并在需要时使用链接属性:
const response = await fetch('/api/todos/1'); const todo = await response.json(); console.log(todo.title); // "Buy groceries" console.log(todo._links.list.href); // "/api/todos"
这里的 fetch
可以是使用 XMLHttpRequest
、axios
或其他网络库发起请求。
结论
使用 HATEOAS 构建 RESTful API 可以使客户端更容易使用 API,并提高可扩展性。我们只需要在响应中添加链接,客户端就可以轻松地发现可以执行的操作。在实现时,我们需要确定哪些链接是必要的,然后在服务器中实现这些链接。通过使用 HATEOAS,我们可以创造更好的 Web API,提高程序的巨大可用性。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/674bc579d657e1f70dbd885b