REST 可发现性和 HATEOAS 是不是意味着您可以更改 URI?

Posted

技术标签:

【中文标题】REST 可发现性和 HATEOAS 是不是意味着您可以更改 URI?【英文标题】:does REST discoverability and HATEOAS imply that you can change URIs?REST 可发现性和 HATEOAS 是否意味着您可以更改 URI? 【发布时间】:2011-12-27 20:40:57 【问题描述】:

我试图澄清一个与 REST 可发现性相关的概念 - 即是否满足 RESTful 服务的 HATEOAS 约束是否意味着现在 URI 可以更改,因为它们是可发现的并且没有记录。

这似乎不符合Cool URIs 的概念——URI 永远不会改变的事实。它也与网络本身的模型有些不一致(REST 本质上应该非常适合)——URL 是可收藏的并且永远不会改变的事实,以及一旦你学会了一个,你就可以直接进入它并且你做的事实不必每次都经过根目录并发现它。

对此的任何反馈表示赞赏。

【问题讨论】:

【参考方案1】:

对于很酷的 URI,不,永远不要更改它们。它们是您系统的入口点。但是,如果您希望能够在未来发展系统的其余 URI 结构,那么您应该很少使用这些。

对于任何非酷 URI,它们确实会随着时间而改变。我最近写了一篇关于这个主题的blog post,因为我发现 REST 能够让我随着时间的推移来发展我的系统非常有用。

确保您的 API 文档阐明了这样一个事实,即您系统中只有少数酷 URI 应该由客户端硬编码,并且任何其他 URI 都应该在运行时通过超媒体遍历发现。将它们想象成 C 指针地址:没有人会关心指针变量的十六进制值是什么,但他们肯定希望它指向内存中的有效位置。您的非酷 URI 也是如此 - 它们的结构无关紧要,但它们是在运行时通过与您的服务器对话检索到的这一事实使它们有效。

【讨论】:

感谢您的快速回复。我已经阅读了这篇文章,但我仍然不清楚一些事情 - 首先,这不是 API 的版本控制吗?其次,应该有任何文件吗?我的理解是,在纯 RESTful 实现中,文档几乎为零。只使用很酷的 url 并使用不同版本的 API 来实现如此彻底的改变会更好吗? 纯粹为了维护 URI 结构兼容性而对 API 进行版本控制会导致与为 Web 服务的每个版本都使用 WSDL 相同的问题:您不是在发展您的服务,而是在添加新的(大部分是重复的) ) 版本,您每次都需要测试、维护、记录等。这样做,并告别 REST 的巨大好处:“合同”的动态演变以及客户端和服务器的奇妙解耦。 至于没有文档,当然——当整个软件世界都开发了 REST 专业知识时,这将是完全合理的。总会有新手想要使用您的 API,但不给他们任何可使用的东西对我来说毫无意义。当然,一个 REST 专家可能会坐下来弄清楚这一切,但这不是我们生活的世界。记录您的媒体类型和每个资源的语义,并提供示例代码来展示应该如何构建良好构建的客户端,并且你会没事的。 从务实的角度来看是有道理的。然而,在需要妥协之前,我更多地考虑的是纯 RESTful 实现。关于版本控制和务实的方法,我对确实被大量客户使用的 API 的实际体验感兴趣 - 真的可以改变吗?务实地,我的想法是它不能,并且版本控制是唯一可行的方法,特别是考虑到保持酷 url 还有其他优势这一事实。感谢您提供有趣的反馈。 我还没有看到没有 URI 版本控制的 RESTful API,我认为这是因为大多数程序员倾向于由 WSDL 等技术孕育的“合同优先”思维方式, CORBA IDL 等。使用 REST 完全可以摆脱这种想法,我鼓励您尝试这样做。【参考方案2】:

必须有文档。 MediaTypes 和 Link Relations 是一个耦合点,客户端和服务器都必须理解这一点。这就是 html、ATOM 和 RSS 有标准的原因。

就运行时功能而言,我可以看到没有文档。我不需要知道雅虎主页上有什么,因为我可以发现。就像我服务的客户不需要知道我发布的新功能一样。他们可以找到链接存在,然后使用链接关系来查看它的作用。

因此,文档是围绕要使用的标准和协议,而不是应用程序本身如何运行

【讨论】:

以上是关于REST 可发现性和 HATEOAS 是不是意味着您可以更改 URI?的主要内容,如果未能解决你的问题,请参考以下文章

架构之:REST和HATEOAS

HATEOAS约束

SpringBoot HATEOAS用法简介

HATEOAS约束

HATEOAS REST Service

Spring Data Rest 和 Hateoas