使用 HATEOAS 进行高效的 REST-API 调用
Make efficient REST-API calls with HATEOAS
我想我基本上理解了 HATEOAS 是什么以及为什么要使用它。但是,我在将其应用于现实世界场景时遇到了一些问题。
例如:
我想在我的客户端应用程序中显示约会列表。约会由日期、地点和人员组成。所有这些信息都应该显示在 table.
中
我的 API 的回复目前看起来是这样的:
{
"id": 1,
"date": "2020-01-01",
"location": {
"name": "my office",
"address": "my street 22"
},
"person": {
"name": "john",
}
},
{
"id": 2,
"date": "2020-01-22",
"location": {
"name": "your office",
"address": "your street 30"
},
"person": {
"name": "peter",
}
}
因此每个约会对象还包含所有相关对象。从我的角度来看,这使得从 REST API 中获取数据变得高效,因为我只需要一个 API 调用。例如:
api.com/appointments
使用 HATEOAS,API 响应可能如下所示:
{
"id": 1,
"date": "2020-01-01",
"location": {
"url": "api.com/location/{id}",
},
"person": {
"url": "api.com/person/{id}",
}
},
{
"id": 2,
"date": "2020-01-22",
"location": {
"url": "api.com/location/{id}",
},
"person": {
"url": "api.com/person/{id}",
}
}
我必须通过额外的 API 调用来获取相关对象。
现在让我们假设如下:
我想显示 100 个约会的列表。每个约会都分配给不同的人和不同的地点。所以我需要一个 API 调用来获取所有约会,另外 100 个 API 调用来获取所有位置,另外 100 个 API 调用来获取所有人。总共有 202 API 个调用。
我觉得这不是很有效率。我在这里有误吗?或者 HATEOAS 在这种情况下如何工作?
您将 REST 与数据库混淆了。如果您的客户需要,您可以扩展嵌套资源。 HATEOAS 更多的是为您的资源添加有用的操作,因此您可以根据需要搜索、阅读、分页、修改、创建、删除它们。对于 REST API,您应该将其视为网页。如果您想查看 table 中的所有约会以及编辑或删除按钮,则您发回该 table 的视图模型以及用于编辑或删除的链接。 REST 客户端通常 运行 在服务器端,使用它的应用程序是 REST 服务的消费者。所以 REST 服务通常不与用户直接联系,REST 客户端也不在浏览器中 运行 尽管它也可以用于单页 JS 应用程序,但它不是为这种用法而设计的。
how would HATEOAS work in such a scenario?
您将如何使用网页执行此操作?
您可以选择很多设计,但一个非常普通的、向后兼容 1990 年代的选择是创建一个包含 100 行的 table,将立即有用的信息直接编码到 table 个单元格,link 到其他可能有用的网页。
那是 很好。
有时,我们使用此网页来显示数据摘要,并提供 link 指示客户端如何找到更丰富的数据视图。
这也很好。
换句话说,您可以自己选择哪些权衡适合您的需求,并设计您的资源模型以使其与这些需求保持一致。
我想我基本上理解了 HATEOAS 是什么以及为什么要使用它。但是,我在将其应用于现实世界场景时遇到了一些问题。
例如:
我想在我的客户端应用程序中显示约会列表。约会由日期、地点和人员组成。所有这些信息都应该显示在 table.
中我的 API 的回复目前看起来是这样的:
{
"id": 1,
"date": "2020-01-01",
"location": {
"name": "my office",
"address": "my street 22"
},
"person": {
"name": "john",
}
},
{
"id": 2,
"date": "2020-01-22",
"location": {
"name": "your office",
"address": "your street 30"
},
"person": {
"name": "peter",
}
}
因此每个约会对象还包含所有相关对象。从我的角度来看,这使得从 REST API 中获取数据变得高效,因为我只需要一个 API 调用。例如:
api.com/appointments
使用 HATEOAS,API 响应可能如下所示:
{
"id": 1,
"date": "2020-01-01",
"location": {
"url": "api.com/location/{id}",
},
"person": {
"url": "api.com/person/{id}",
}
},
{
"id": 2,
"date": "2020-01-22",
"location": {
"url": "api.com/location/{id}",
},
"person": {
"url": "api.com/person/{id}",
}
}
我必须通过额外的 API 调用来获取相关对象。
现在让我们假设如下:
我想显示 100 个约会的列表。每个约会都分配给不同的人和不同的地点。所以我需要一个 API 调用来获取所有约会,另外 100 个 API 调用来获取所有位置,另外 100 个 API 调用来获取所有人。总共有 202 API 个调用。
我觉得这不是很有效率。我在这里有误吗?或者 HATEOAS 在这种情况下如何工作?
您将 REST 与数据库混淆了。如果您的客户需要,您可以扩展嵌套资源。 HATEOAS 更多的是为您的资源添加有用的操作,因此您可以根据需要搜索、阅读、分页、修改、创建、删除它们。对于 REST API,您应该将其视为网页。如果您想查看 table 中的所有约会以及编辑或删除按钮,则您发回该 table 的视图模型以及用于编辑或删除的链接。 REST 客户端通常 运行 在服务器端,使用它的应用程序是 REST 服务的消费者。所以 REST 服务通常不与用户直接联系,REST 客户端也不在浏览器中 运行 尽管它也可以用于单页 JS 应用程序,但它不是为这种用法而设计的。
how would HATEOAS work in such a scenario?
您将如何使用网页执行此操作?
您可以选择很多设计,但一个非常普通的、向后兼容 1990 年代的选择是创建一个包含 100 行的 table,将立即有用的信息直接编码到 table 个单元格,link 到其他可能有用的网页。
那是 很好。
有时,我们使用此网页来显示数据摘要,并提供 link 指示客户端如何找到更丰富的数据视图。
这也很好。
换句话说,您可以自己选择哪些权衡适合您的需求,并设计您的资源模型以使其与这些需求保持一致。