非 HATEOAS 示例

Non-HATEOAS examples

我一直在研究 REST,特别是维基百科上的 HATEOAS,据说

The principle is that a client interacts with a network application entirely through hypermedia provided dynamically by application servers

如果不通过超媒体,客户还可以如何与应用程序交互?

有哪些非 HATEOAS 交互的代码示例?

你遗漏的重要部分是

A REST client needs no prior knowledge about how to interact with any particular application or server beyond a generic understanding of hypermedia

想法是,在不知道您的 API 有哪些可用资源或如何与它们交互的情况下,客户端可以使用 HATEOAS 动态发现您的 API 以及如何交互和他们在一起。

例如:

{
    "_links": {
        "self": { "href": "/orders" },
        "next": { "href": "/orders?page=2" }
    }
}

self 我可以推断我目前在 /orders/ 并且从 next 可以推断出下一组资源在 /orders?page=2.

可用

不仅如此,它还告诉我从给定的资源中可以根据该资源状态执行哪些操作

即在这种情况下,应该有第二页订单,否则 next 将不是一个选项。 (它会在回复中)

查看 Hal Browser,它允许您动态导航 API,而无需预先了解它。

非 HATEOAS API 需要有关资源和它们之间关系的先验知识。

例如,如果考虑图书馆 API,'book' 资源可能具有作者的姓名或 ID 作为属性。要获得有关作者的更多信息,API 客户端必须以某种方式知道 'author' 资源具有特定的上下文路径,并且它的 ID 是属性值。如果客户想借那本特定的书,事情会变得更加复杂。为此,它必须知道必须执行 POST 请求才能创建具有特定属性(如图书 ID)的特定资源。如何做这些事情的知识必须在客户端实现中硬编码。在 HATEOAS 中,每个 'book' 都会有 link 到所有相关资源,它还会包含有关与该书相关的操作的信息。

PayPal 客户纠纷 API 可以作为非 HATEOAS 的真实示例 API。检查 'list disputes' part: it provides a list of resources with various attributes. Then see the 'provide evidence' part。它说客户可以提供与争议相关的资源。仅仅按照 API 中的资源中的 link 是不可能弄清楚的。如果它是 HATEOAS,那么 'dispute' 资源中应该有某种 link,可以传达为每个争议添加 'evidence' 的可能性。作为程序员,您必须阅读文档才能知道 'disputes' 可以添加 'evidences'。

我真的推荐 this video 作为关于 HATEOAS 是什么以及如何表达资源之间关系的优秀学习 material。