如何在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来创建新资源并不是幂等的,并且它会感觉到#34;错误;一个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的一部分而且没有类似的标识符 - 所以我觉得我在错误的轨道上......
也许我的客户应该只是"知道" GET transfer
返回匹配的传输资源,POST transfer
创建新的传输资源。
FWIW,我的实现使用Spring Boot 2和Spring HATEOAS,所以后续问题是如何使用Spring HATEOAS来表达它...
答案 0 :(得分:3)
你不能用HAL做到这一点。 HAL的创建者Mike Kelly,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集成的。