【发布时间】:2018-09-29 16:53:01
【问题描述】:
我正在用 ASP NET Core 编写 Web API,我想从单页应用程序(例如使用 Angular、Vue、React)、本机桌面应用程序和移动应用程序中使用它。
我偶然发现了一个名为 “HATEOAS” 的概念,我了解到我正在构建的 API 并不是真正的 RESTful,因此我错误地将其命名为 RESTful (https://devblast.com/b/calling-your-web-api-restful-youre-doing-it-wrong)。
似乎大多数人都不好用这个词(Roy T. Fielding - REST 想法背后的人关于他的烦恼:http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven)
根据我了解到的 HATEOAS 背后的想法,您可以像考虑网站一样考虑您的应用程序,这意味着它公开了指向资源的链接(如 HTML 中的 <a href.../>),因此您不必对链接/端点进行硬编码如果您更改某些端点 (?),您的客户端代码和客户端代码不会中断。
另一件事是它使您的 API 无需任何文档即可被发现,即 API 描述自己(如元 API)
例如,当我查看 C# 的现有“REST”客户端时:
他们的名字中有“REST”,但没有人深入研究 HATEOAS 的概念。那么为什么他们被命名为“Rest clients”呢?
HATEOAS 应该如何在客户端使用?令我惊讶的是,互联网上并没有太多关于它的内容,关于如何在服务器上实现 HATEOAS 的内容很多,但它应该如何在客户端上工作的内容并不多。这通常应该提供导航逻辑。
除此之外,还有许多 API 客户端生成器(解析 OpenAPI 规范),例如 AutoRest(与超链接和 HATEOAS 无关,令我惊讶的是)或 NSwag
我在谷歌上搜索了几个小时来了解 HATEOAS,但大多数人在谈论它时没有描述如何使用它(几乎没有客户端库支持它)。
它有很多标准,如HAL、Ion 等。但几乎没有其他客户端库实现这些标准。还有json:api。所有这些标准都非常相似。
所以我的问题是:
HATEOAS 是否适用于 SPA、移动和桌面客户端等应用程序?
HATEOAS 的真正用例是什么,如果我也可以硬编码我的端点,或者在 OpenAPI (Swagger) 规范发生变化时生成新的 API 客户端?
是否值得为此烦恼?
几乎没有与 HATEOAS 或超媒体 API 交互的实际示例,或者我在这里遗漏了一些东西并且它们不应该被我的客户端代码使用?
对我来说,在客户端和服务器上实现它似乎是很多样板代码,所以为什么没有很多库支持它开箱即用(使用标准之一)。好像 json:api 有很多实现http://jsonapi.org/implementations/#client-libraries-net
【问题讨论】:
-
虽然我认为这是一个很好的问题,但我认为它不太适合这里,而是Software Engineering
-
@PaulKertscher 说得好
-
我同意 Paul 的观点,但简短的回答是您是对的,REST API 不是“纯”REST。很难为 .NET 世界找到一个好的、完整的 REST 框架。有一次,我使用并喜欢 OpenRasta,但 3.x 重写有点横空出世。我也使用过 Nancy,但它不像 Seb 使用 OpenRasta 管理的那样纯粹。遗憾的是它还没有流行起来,如果您从一开始就拥有走这条路的奢侈,那么纯 REST 是一种很好的工作方式。 (不过,以后几乎不可能融入项目。)
-
这取决于你的项目。如果您只是在做一个 API,那么所有开销都没有多大意义,出于同样的原因,ASP.NET API 项目默认情况下不会为您提供像 Razor 这样的东西。如果你正在做一个完整的站点,坦率地说,我现在不知道在 .NET / .NET Core 中以正确的方式进行全面 REST 的好方法——但我最近也没有真正寻找过.
-
@McGuireV10 我认为做完整的 REST 不值得那么痛苦,因为我发现直接序列化我的模型要简单得多,而无需所有元数据和链接。我使用 swashbuckle 生成 OpenAPI 规范并为我生成文档,我还将使用 NSwag 或 Autorest 等工具生成客户端代码
标签: c# rest asp.net-core-webapi hateoas json-api