我正在设计RESTful Web服务,并且正在尝试正确使用超媒体来建立资源之间的关系。对于某些资源,客户端需要能够为另一个资源分配关系,但在我看来,要求客户端生成超链接和POST / PUT / PATCH /无论这个超链接到资源有什么缺点(更复杂对于客户端,安全性和负载平衡问题等)。我想让客户端发送一个简单的ID并让服务器生成URL会更好。
以下是钢琴租赁API的一些完全人为的资源,以展示我的想法。
GET http://company.com:9999/customers/42
{
"id" : 42,
"name" : "George P. Burdell",
"phone" : "555-555-5555",
"piano" : { "href" : "http://company.com:9999/pianos/101"}
}
GET http://company.com:9999/pianos/101
{
"id" : 101,
"make" : "Steinway",
"model" : "Model D"
}
假设客户想要租用另一架钢琴。
客户端发送部分更新,例如:
PATCH http://company.com:9999/customers/42
{ "piano" : 202}
然后,服务器将为新钢琴资源生成正确的URL并相应地更新:
GET http://company.com:9999/customers/42
{
"id" : ...,
"name" : ...,
"phone" : ...,
"piano" : { "href" : "http://company.com:9999/pianos/202"}
}
修改 在我看来,直接更新超链接的客户可能会有问题。这是一个非常好的解决方案,还是有更好的解决方案?这根本不是问题吗?此外,客户端以某种方式更新资源超链接的真实世界示例将是伟大的 - 我还没有找到任何。
答案 0 :(得分:1)
您的回复缺少HATEOAS contraint RESTful系统所需的链接和表单。例如,如果客户想要租用不同的钢琴,那么您可以在钢琴响应中添加“租借”表格。例如
GET http://company.com:9999/pianos/101
{
"self" : "http://company.com:9999/pianos/101",
"id" : 101,
"make" : "Steinway",
"model" : "Model D",
"rent" : {
"href" : "http://company.com:9999/pianos/101",
"method" : "post"
// you can add form parameters like from and to dates here
}
}
IMO应该创建一个“租赁”资源,这将提供钢琴和客户之间的多对多关系。然后,为了让客户取消租赁,您可以在租赁协议上删除表格。
以下是一些很好的文章: