Rest 生成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工厂构建的,等等,我真的(想)不必

假设我有一个用于管理订单的RESTful API,用于简化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):

我的问题是:从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

一些例子:

  • 从一个帐户向另一个帐户转账:
    POST/transfer[acc1,acc2,amount,currency]
    -转账不必作为一个实体存在于您的域逻辑中(不要在生产代码中尝试这种解决方案,除非您想要破产:D)
  • 向其他用户发送电子邮件:
    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]
    来更新玩家的经验值
关于类似WSDL的解决方案,您可以在此处阅读更多内容:


我个人认为建立这样一个系统是不值得的,因为它弊大于利。

既然你在使用JavaScript,你是否意识到/你考虑过像HygAgTun.js之类的基础吗?谢谢,我查一下。你能给我发一些关于HAL为什么好用的教程吗?
GET /orders/* (I'd need a suitable wildcard of course)
  {
    "_links": {
      "addItem": {
        "href": "/orders/{id}/items",
        "templated": true,
        "type": "method"
      }
    }
  }