最近,我一直在阅读有关作为应用程序状态引擎(HATEOAS)的Hypermedia的信息,据称该约束使Web API成为“真正的RESTful”。它归结为基本上包括链接,这些链接包含对从当前状态可能进行的转换的每个响应。
让我根据自己的理解来说明HATEOAS是什么-如果错过任何事情,请纠正我。
/
GET: {
"_links": {
"child": [
{ "href": "http://myapi.com/articles", "title": "articles" }
]
}
}
/articles?contains=HATEOAS
GET: {
"_items": [
{ "uri": "http://myapi.com/articles/0", "title": "Why Should I Care About HATEOAS?" },
{ "uri": "http://myapi.com/articles/1", "title": "HATEOAS: Problem or Solution?" }
],
"_links": {
"self": { "href": "http://myapi.com/articles", "title": "articles" },
"parent": { "href": "http://myapi.com/", "title": "home" }
}
}
POST: {
"title": "A New Article",
"body": "Article body",
"tags": [ "tag1", "tag2" ]
}
/articles/0
GET: {
"title": "Why Should I Care About HATEOAS?",
"body": "Blah blah blah"
"tags": [ "REST", "HATEOAS" ],
"_links": {
"self": { "href": "http://myapi.com/articles/0", "title": "article" },
"parent": { "href": "http://myapi.com/articles", "title": "articles" }
}
}
据说HATEOAS具有两个主要优点:
从根URI开始就可以发现整个服务,不再需要文档。
客户端与服务器解耦,服务器现在可以自由更改URI结构。这消除了API版本控制的需要。
但是在我看来,服务不仅仅是其URI结构。为了有效地使用它,您还需要了解:
- 您可以使用哪些查询参数及其可能的值
- JSON / XML /您需要在POST / PATCH / etc请求中发送的所有文档的结构
- 服务器发送的响应的结构
- 可能发生的错误
- ...
基于上述内容,HATEOAS仅解决了极小的可发现性和耦合问题。您仍然需要记录以上四个方面,并且由于它们,客户端仍将与服务器紧密耦合。为了避免破坏客户端,您仍然需要对API进行版本控制。
它提供的唯一好处是您可以自由地或多或少地更改URL结构(顺便说一下,“ Cool URIs not change”原理是怎么回事?)。我的理解正确吗?