HAL中的HATEOAS POST链接

问题描述 投票:1回答:1

如何描述HAL中的POST链接?

我正在设计一个带有HATEOAS约束的RESTful API,类似于Wikipedia's HATEOAS example,但用HAL JSON表示(为了清楚起见,删除了方案,主机等):

GET /accounts/12345

{
  "id" : 12345,
  "balance" : 100.00
  "_links" : {
    "self" : {
      "href" : "/accounts/12345"
    },
    "transfer" : {
      "href" : "/accounts/12345/transfer{?amount,target}",
      "templated" : true
    }
  }
}

要执行“转移”操作,客户端可能会执行以下操作:

GET /accounts/12345/transfer?amount=100.00,target=54321

{
  "id" : 34567,
  "amount" : 100.00
  "_links" : {
    "self" : {
      "href" : "/transfers/34567"
    },
    "source" : {
      "href" : "/account/12345"
    },
    "target" : {
      "href" : "/account/54321"
    }
  }
}

通过GET调用“传输”链接会在“传输”中创建一个新资源。但是,进行GET创建新资源并不是幂等的,而是“感觉”错误;一个RESTful以资源为中心的API将POST:

POST {amount: 10.00, source: 12345, target: 54321}  /transfers/

{
  "id" : 34567,
  "amount" : 100.00
  "_links" : {
    "self" : {
      "href" : "/transfers/34567"
    },
    "source" : {
      "href" : "/account/12345"
    },
    "target" : {
      "href" : "/account/54321"
    }
  }
}

但是,如何在HAL中描述此POST和所需的表单元素,以便客户端可以在不进行硬编码的情况下执行“正确的操作”?也许是这样的:

{
  "id" : 12345,
  "balance" : 100.00
  "_links" : {
    "self" : {
      "href" : "/accounts/12345"
    },
    "transfer" : {
      "href" : "/transfers{?amount,source,target}",
      "templated" : true,
      "method" : "POST"
    }
  }
}

method不是HAL specification的一部分,并且没有类似的标识符 - 所以感觉我在错误的轨道上......

也许我的客户应该“知道”transfer的GET返回匹配的传输资源,而对transfer的POST会创建一个新的传输资源。

FWIW,我的实现使用Spring Boot 2和Spring HATEOAS,所以后续问题是如何使用Spring HATEOAS来表达它...

java spring-boot hateoas spring-hateoas
1个回答
3
投票

你不能用HAL做到这一点。 Mike Kelly,HAL的创造者,states on GitHub

这样做的“HAL方式”是使用link rel文档以人类可读的形式传达可用的方法。即。你的吠声示例看起来像这样(注意“barks”链接rel现在是一个URL)

{
   "_links": {
        "http://docs.example.com/barks": { "href": "/v1/dogs/1/barks" }
    }
}

如果开发人员在浏览器中获取URL http://docs.example.com/barks,则文档可以指定可用的方法,有效的请求主体,潜在的响应代码,响应主体等。然后开发人员将其编入她正在构建的客户端。

这是HAL规范imho的一个主要缺陷,但是还有其他类型的解决这个问题,如Mason或HAL扩展HAL-FORMS。可能值得检查这些,但我不确定它们如何与Spring集成。

© www.soinside.com 2019 - 2024. All rights reserved.