首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >REST HATEOAS (成熟度级别3)有多重要?

REST HATEOAS (成熟度级别3)有多重要?
EN

Stack Overflow用户
提问于 2013-12-03 03:11:23
回答 2查看 23.2K关注 0票数 127

我参与了一个项目,其中一些高级团队成员认为REST API必须符合HATEOAS并实现Richardson的所有成熟度级别(http://martinfowler.com/articles/richardsonMaturityModel.html)!

AFAIK大多数REST实现都不符合HATEOAS,应该有一个很好的理由来解释为什么更多的人不这么做。我可以想到一些原因,比如增加的复杂性,缺乏框架(服务器端和客户端),性能问题以及……

你认为如何?你有在现实世界项目中使用HATEOAS的经验吗?

EN

回答 2

Stack Overflow用户

发布于 2018-10-17 14:39:11

我们正在构建一个REST level 3 API,其中我们的响应是HAL-Json。HATEOAS对于前端和后端都很好,但它也带来了挑战。我们为在HAL-Json响应中管理ACL做了一些定制/添加(这不会违反HAL-Json标准)。

在我看来,HATEOAS最大的优点是我们不需要在前端应用程序上编写/猜测任何urls。您所需要的只是一个入口点(https://hostname),从那里开始,您就可以使用响应中提供的链接或模板链接来浏览资源。就像这样,版本控制可以很容易地处理,重命名/替换urls,用额外的关系扩展资源,而不会破坏前端代码。

在前端缓存资源是使用自链接的小菜一碟。我们还通过套接字连接将资源推送到客户端,因为这些资源也是在HAL中呈现的,我们可以很容易地以同样的方式将它们添加到缓存中。

使用HAL-Json的另一个好处是,响应模型应该是什么样子是很清楚的,因为有一个应该遵循的文档标准。

我们的定制之一是在自链接对象中添加一个actions对象,该对象向前端公开通过身份验证的用户可以在相应资源(create:POSTread:GETupdate:PUTedit:PATCHdelete:DELETE)上执行的操作或CRUD操作。就像这样,我们的前端ACL完全由REST API响应决定,将这一责任完全转移到后端模型。

举个简单的例子,你可以在HAL-Json中创建一个post对象,如下所示:

代码语言:javascript
复制
{
    "_links": {
        "self": {
            "href": "https://hostname/api/v1/posts/1",
            "actions": {
                "read": "GET",
                "update": "PUT",
                "delete": "DELETE"
            }
        }
    },
    "_embedded": {
        "owner": {
            "id": 1,
            "name": "John Doe",
            "email": "john.doe@example.com",
            "_links": {
                "self": {
                    "href": "https://hostname/api/v1/users/1",
                    "actions": {
                        "read": "GET"
                    }
                }
            }
        }
    },
    "subject": "Post subject",
    "body": "Post message body"
}

现在,我们在前端所要做的就是使用isAllowed方法构建一个AclService,该方法检查我们想要执行的操作是否在actions对象中。

目前在前端,它看起来很简单:post.isAllowed('delete');

我认为休息3级很好,但它可能会导致一些令人头痛的问题。你需要对REST有一个很好的理解,如果你想使用第3级REST,我建议你严格遵循REST的概念,否则你很容易在实现它的过程中迷失方向。

在我们的例子中,我们的优势是我们同时构建了前端和后端,但原则上这不应该有什么不同。但我在我们的团队中看到的一个常见陷阱是,一些开发人员试图通过更改他们的后端模型来解决前端问题(架构),以便“适合”前端需求。

票数 10
EN

Stack Overflow用户

发布于 2013-12-03 04:38:13

我在一些实际项目中使用过HATEOAS,但与Richardson的解释不同。如果这是你的老板想要的,那么我想你应该直接去做。我认为HATEOAS意味着您的资源应该包括HTML文档类型、相关资源的超链接和HTML表单,以公开除GET之外的谓词的功能。(这是当接受类型为text/html时-其他内容类型不需要这些额外的内容。)我不知道整个应用程序中的所有REST资源都必须粘合在一起的想法是从哪里来的。网络应用程序应该包含多个资源,这些资源可能直接相关,也可能不直接相关。或者为什么人们认为XML、JSON和其他类型需要遵循这一点。(HATEOAS是特定于HTML的。)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20335967

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档