假设我有一个RESTful API来管理使用HAL来促进HATEOAS的订单:
GET /orders/2
{
"_links": {
"self": "/orders/2",
"items": "/orders/2/items"
},
"subtotal": 30.0,
"shipped": false
}
我想使用一组接口编写我的客户端(应用程序),以便假设这些接口的实现是DI-d /由DI-d工厂等构建,我真的不想(想)必须要关心他们是否得到我的RESTful API的支持。作为一个例子(伪C#/ Java):
public interface Order {
public void addItem(Item item);
public float getSubtotal();
public boolean getShipped();
}
Order order = ...;
Item item = ...;
order.addItem(item);
...(order.getSubtotal())...;
我的问题是:我是否可以从API生成Order
/ Item
接口的实现?我的意思是以类似于导出WSDL的C#/ web服务提供的方式。
我一直在考虑为OPTIONS
和/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"
}
}
}
当然,我可以使用任何给定资源(例如_links
)返回/orders/2
对象的这一部分,但这会阻止静态代码生成。
我想知道是否有一种合理的方法来封装这样一个事实:如果提供了特定的链接,相关的操作应该可用/执行,否则不会。
注意:如果重要,我实际上是在使用JavaScript(特别是使用AngularJS)。但是,我仍然希望使用一组概念性接口/合同来编写我的应用程序。
答案 0 :(得分:1)
我的问题是:我可以/生成实现是否有意义 API的订单/项目界面?我的意思是这样 类似于导出WSDL的C#/ web服务所提供的。
部分有意义。通过简单的CRUD API,您可以将资源映射到实体。对于复杂的应用程序,它不起作用,因为您将URI
映射到resource
和METHOD URI
对到operation
。因此,每当您需要非HTTP定义的操作时,您必须为现有资源创建新资源或至少新URI。
一些例子:
POST /transfer [acc1, acc2, amount, currency]
- 转移不一定作为域逻辑中的实体存在(除非您想要破产,否则不要在生产代码中尝试这种解决方案:D)< / LI>
POST /messages [recipient, message]
GET /users/123/address
GET /users?name="John"
PUT /users/123 [details]
代替POST /users [details]
来创建新用户POST /player/123/xp/increment 10
代替PUT /player/123/xp [xp+10]
来更新播放器的体验点关于类似WSDL的解决方案,您可以在此处阅读更多内容:Third Generation Web APIs - Markus Lanthaler。
我个人认为建立这样一个系统并不值得,因为它有更多的缺点而不是优点。