Rest 生成HATEOAS客户端库
假设我有一个用于管理订单的RESTful API,用于简化HATEOAS:Rest 生成HATEOAS客户端库,rest,code-generation,restful-architecture,hateoas,Rest,Code Generation,Restful Architecture,Hateoas,假设我有一个用于管理订单的RESTful API,用于简化HATEOAS: GET /orders/2 { "_links": { "self": "/orders/2", "items": "/orders/2/items" }, "subtotal": 30.0, "shipped": false } 我想使用一组接口来编写我的客户机(应用程序),这样,假设这些接口的实现是DI-d/由DI-d工厂构建的,等等,我真的(想)不必
GET /orders/2
{
"_links": {
"self": "/orders/2",
"items": "/orders/2/items"
},
"subtotal": 30.0,
"shipped": false
}
我想使用一组接口来编写我的客户机(应用程序),这样,假设这些接口的实现是DI-d/由DI-d工厂构建的,等等,我真的(想)不必关心它们是否由我的RESTful API支持。例如(伪C#/Java):
我的问题是:从API生成订单
/项
接口的实现是否有意义?我的意思是以类似于导出wsdl的C#/web服务的方式
我一直在考虑为/orders
和/orders/{id}
等资源实现选项
,这样我就可以有效地拥有一个HATEOAS API来遍历API的模式:
GET /orders/* (I'd need a suitable wildcard of course)
{
"_links": {
"addItem": {
"href": "/orders/{id}/items",
"templated": true,
"type": "method"
}
}
}
当然,我可以使\u links
对象的这一部分与任何给定的资源一起返回(例如,/orders/2
),但这排除了静态代码生成
我想知道是否有一种合理的方式来封装这样一个事实,即如果提供了一个特定的链接,那么相关的操作应该是可用的/执行的,否则就不可用了
注意:如果这很重要,我实际上是在使用JavaScript(特别是AngularJS)。但是,我仍然希望使用一组概念接口/契约来编写我的应用程序
我的问题是:生成实现是否有意义
API中的订单/项目接口的名称?我的意思是在某种程度上
与导出wsdl的C#/web服务类似
这在一定程度上是有道理的。通过一个简单的CRUDAPI,您可以将资源映射到实体。对于复杂的应用程序,它不起作用,因为您将URI
s映射到resource
s,并将methoduri
对映射到operation
s。因此,如果每次需要一个未由HTTP定义的操作,则必须为现有资源创建一个新资源或至少一个新URI
一些例子:
- 从一个帐户向另一个帐户转账:
-转账不必作为一个实体存在于您的域逻辑中(不要在生产代码中尝试这种解决方案,除非您想要破产:D)POST/transfer[acc1,acc2,amount,currency]
- 向其他用户发送电子邮件:
POST/messages[收件人,message]
- 您也可以将资源映射到值对象:
GET/users/123/address
- 您可以使用URI映射减少集合:
GET/users?name=“John”
- 您可以使用
而不是PUT/users/123[details]
来创建新用户POST/users[details]
- 您可以使用
而不是POST/player/123/xp/increment 10
来更新玩家的经验值PUT/player/123/xp[xp+10]
我个人认为建立这样一个系统是不值得的,因为它弊大于利。既然你在使用JavaScript,你是否意识到/你考虑过像HygAgTun.js之类的基础吗?谢谢,我查一下。你能给我发一些关于HAL为什么好用的教程吗?
GET /orders/* (I'd need a suitable wildcard of course)
{
"_links": {
"addItem": {
"href": "/orders/{id}/items",
"templated": true,
"type": "method"
}
}
}