我被要求设计和实现一个 RESTful API,并且一直在研究最佳实践,但到目前为止,我对资源表示只有一个模糊的概念。我发现的大多数可用示例似乎都主要关注使用一系列 GET 遍历连接结构的 API 客户端。
我看过:
http://www.restapitutorial.com/media/RESTful_Best_Practices-v1_1.pdf
http://www.youtube.com/watch?v=HW9wWZHWhnI
在其他在线资源中(我仅限于 2 个链接,抱歉无法全部列出)。它们都很棒,但并没有真正解决我的设计问题。
大多数最佳实践文档都提出了两件在我看来略有冲突的事情:
1) REST 服务应该将数据关系表示为资源之间的链接
2) 来自客户端的“PUT”请求应该是完整的表示,形式与服务器上看到的表示相同。
从我的角度来看,问题在于链接以及典型资源中的许多其他属性是只读的,因此无法更新。服务器显然应该按原样期望它们,如果它认为客户端正在尝试更新它们,则返回错误。事实上,当我查看以 JSON 表示的典型资源时,其中大部分是逻辑上不能/不应该替换的数据。例如
{
"link": { "rel":"self", "href":"http://example/project/12345" },
"team": {
"link": { "rel":"self", "href":"http://example/project/12345/team" },
"title": "The project team"
},
"title": "The Big Project"
}
这里充其量只有两个标题文本可以写入此资源上的客户(团队成员可能通过团队链接更改)。
所以我是否应该要求 PUT 完全按原样包含所有“链接”元素,这些元素纯粹是逻辑和只读的(请注意,在示例中,团队无法重新链接,因为资源将其定义为团队对于项目 - 在这种情况下可以更改,但对于具有更严格容器的许多资源类型,这不适用)?
是否有标准模式或反模式来表示具有许多链接的 REST 中的资源?我没有被要求提供特定的 REST 变体,例如 HATEOAS,尽管我倾向于尽可能地瞄准理论上的“正确性”。换句话说,如果“官方” REST 期望客户端 PUT 整个资源、链接和所有内容,那么这可能就是我要做的。
支持 GET 和 PUT 的现实世界复杂非叶 REST 资源的一些示例,因此必须处理此问题,我们将不胜感激。当我搜索时,我得到了很多意见,还有很多例子展示了 GET 的工作原理。. . 但到目前为止,我还没有看到一个有据可查的例子,它显示了一个 PUT 到除了一个微不足道的叶子资源之外的任何东西(即一个不包含任何链接,除了可能是一个自我引用)。