我被要求设计和实现一个RESTful API,并一直在研究最佳实践,但到目前为止只有关于资源表示的概念。我发现的大多数可用示例似乎都将重点放在使用一系列GET获取连接结构的API客户端上。带有链接的REST资源表示,与PUT和GET兼容
我已经看过:
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会希望客户把整个资源,链接和所有内容放在一起,那么这可能是我会做的。
真的很感激一些支持GET和PUT并因此必须处理这个问题的现实世界复杂的非叶REST资源的例子。当我搜索时,我得到很多意见,并且很多例子显示了GET如何很好地工作。 。 。但到目前为止,我还没有看到一个记录良好的例子,显示PUT除了一个简单的叶资源(即不包含任何链接,除了可能是自引用外)。
谢谢。我的铅笔设计包含一个“属性”部分,它与“身体”成员的想法非常相似。我也在考虑将这些事情分解到他们自己的叶子资源中,这会为我的设计增加5或6种资源类型(不好),但是相当简化PUT方法(好) –