【发布时间】:2016-03-12 10:45:38
【问题描述】:
我一直在研究 REST,特别是 Wikipedia 上的 HATEOAS,据说
原理是客户端完全通过应用服务器动态提供的超媒体与网络应用交互
如果不通过超媒体,客户端将如何与应用交互?
有哪些非 HATEOAS 交互的代码示例?
【问题讨论】:
我一直在研究 REST,特别是 Wikipedia 上的 HATEOAS,据说
原理是客户端完全通过应用服务器动态提供的超媒体与网络应用交互
如果不通过超媒体,客户端将如何与应用交互?
有哪些非 HATEOAS 交互的代码示例?
【问题讨论】:
非 HATEOAS API 需要事先了解资源和它们之间的关系。
例如,如果考虑图书馆 API,“书”资源可能具有其作者的姓名或 ID 作为属性。要获取有关作者的更多信息,API 客户端必须以某种方式知道“作者”资源具有特定的上下文路径,并且它的 ID 是属性值。如果客户想借那本书,事情会变得更加复杂。为此,它必须知道必须执行 POST 请求才能创建具有某些属性(如书籍 ID)的特定资源。如何做这些事情的知识必须在客户端实现中硬编码。在 HATEOAS 中,每本“书”都有指向所有相关资源的链接,并且还包含与该书相关的操作信息。
PayPal Customer Disputes API 可以用作真实世界的非 HATEOAS API 示例。检查'list disputes' part:它提供了具有各种属性的资源列表。然后查看the 'provide evidence' part。它表示客户可能会提供与争议相关的资源。仅通过 API 中资源中的链接是无法弄清楚的。如果是 HATEOAS,那么“争议”资源中应该有某种链接,可以传达为每个争议添加“证据”的可能性。作为程序员,您必须阅读文档才能知道“争议”可以添加“证据”。
我真的推荐this video 作为关于什么是 HATEOAS 以及如何表达资源之间关系的优秀学习材料。
【讨论】:
您缺少的重要部分是
REST 客户端不需要事先了解如何与任何 超出一般理解的特定应用程序或服务器 超媒体
这个想法是,在不知道您的 API 中有哪些资源可用或如何与它们交互的情况下,客户端可以使用 HATEOAS 动态发现您的 API 以及如何与它们交互。
例如:
{
"_links": {
"self": { "href": "/orders" },
"next": { "href": "/orders?page=2" }
}
}
从self 我可以推断我目前在/orders/ 并且从next 可以在/orders?page=2 获得下一组资源。
不仅如此,它还告诉我从给定资源中可以根据该资源状态执行哪些操作
即在这种情况下,应该有第二页订单,否则next 将不是一个选项。 (它会在响应中)
查看Hal Browser,它允许您在没有任何先验知识的情况下动态导航 API。
【讨论】: