资源超链接的RESTful更新

时间:2012-03-14 16:39:19

标签: web-services rest

我正在设计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"}
}

修改 在我看来,直接更新超链接的客户可能会有问题。这是一个非常好的解决方案,还是有更好的解决方案?这根本不是问题吗?此外,客户端以某种方式更新资源超链接的真实世界示例将是伟大的 - 我还没有找到任何。

1 个答案:

答案 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应该创建一个“租赁”资源,这将提供钢琴和客户之间的多对多关系。然后,为了让客户取消租赁,您可以在租赁协议上删除表格。

以下是一些很好的文章: