生成HATEOAS客户端库

时间:2013-08-15 08:32:48

标签: rest code-generation restful-architecture hateoas

假设我有一个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)。但是,我仍然希望使用一组概念性接口/合同来编写我的应用程序。

1 个答案:

答案 0 :(得分:1)

  

我的问题是:我可以/生成实现是否有意义   API的订单/项目界面?我的意思是这样   类似于导出WSDL的C#/ web服务所提供的。

部分有意义。通过简单的CRUD API,您可以将资源映射到实体。对于复杂的应用程序,它不起作用,因为您将URI映射到resourceMETHOD URI对到operation。因此,每当您需要非HTTP定义的操作时,您必须为现有资源创建新资源或至少新URI。

一些例子:

  • 将资金从一个帐户转移到另一个帐户:POST /transfer [acc1, acc2, amount, currency] - 转移不一定作为域逻辑中的实体存在(除非您想要破产,否则不要在生产代码中尝试这种解决方案:D)< / LI>
  • 向其他用户发送电子邮件:POST /messages [recipient, 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]来更新播放器的体验点

关于类似WSDL的解决方案,您可以在此处阅读更多内容:Third Generation Web APIs - Markus Lanthaler

我个人认为建立这样一个系统并不值得,因为它有更多的缺点而不是优点。