我正在尝试将 HATEOAS 应用于现有应用程序,但在对由 API 响应驱动的表单输入进行建模时遇到了麻烦。
该应用程序允许搜索和预订两个地方之间的联系。第一个端点允许搜索连接GET /connections?from={lat,lon}&to={lat,lon}&departure={dateTime}
并返回以下有效负载(响应正文)。
[
{
"id": "aaa",
"carrier": "Fast Bus",
"price": 3.20,
"departure": "2019-04-05T12:30"
},
{
"id": "bbb",
"carrier": "Airport Bus",
"price": 4.60,
"departure": "2019-04-05T13:30"
},
{
"id": "ccc",
"carrier": "Slow bus",
"price": 1.60,
"departure": "2019-04-05T11:30"
}
]
为了订购其中一个连接,客户端需要POST /orders
使用以下有效负载之一(请求正文)发出请求:
- 需要电子邮件
{ "connectionId": "aaa", "email": "passenger@example.org" }
- 需要电子邮件和航班号(承运人仅处理机场连接)
{ "connectionId": "bbb", "email": "passenger@example.org", "flightNumber": "EA1234" }
- 需要电话号码
{ "connectionId": "ccc", "phoneNumber": "+44 111 222 333" }
有效载荷是不同的,因为不同的连接可能由不同的运营商处理,并且它们中的每一个都可能需要提供一些不同的信息集。我想通知 API 客户端,创建订单时需要哪些字段。我的问题是如何使用 HATEOAS 做到这一点?
我检查了不同的规格,这是我从阅读规格中可以看出的:
- HAL & HAL-FORMS有,
"_templates"
但是,模板本身没有 URI。假定它在 self 链接上运行,在我的情况下是/connections...而不是/orders。 - JSON-LD我找不到有关表单或模板支持的任何信息。
- JSON-API我找不到任何关于表单或模板支持的信息。
- Collection+JSON每个文档最多有一个
"template"
,因此假定集合的所有元素都具有相同的字段,而在我的应用程序中并非如此。 - Siren看起来
"actions"
适合我的用例,但该项目似乎已死,并且没有许多主要语言的支持库。 - CPHL该项目似乎已死,文档很少,也没有库。
- Ion对表单有很好的支持,但我找不到任何支持库。看起来它现在只是一个规范。
像 API 驱动的表单这样的常见问题是否仍然无法通过规范和工具解决?