我怀疑在RESTful API中解决有序列表的最佳方法是什么。想象一下下面的例子:让我们创建一个LP的图表列表,你想要添加新的LP,删除那些不在TOP10中的LP,并改变它们的位置。您将如何在RESTful JSON-API中实现这些方法?
我想到了以下方式:
[{ "name": "1st-place LP", "link": "/uid123" }, { "name": "2nd-place LP", "link": "/uid987" }, ...]
{"name": "1st-place LP", "ranking": 1 }
303 See Other
,其位置标题为Location: /uid123
{ "name": "my first LP title" }
创建新的LP而不指定其当前的图表位置现在问题是我们如何改变当前的图表位置?可以简单地 PUT / {uid} 来更新ranking
属性,但我认为 PUT / ranking / {position} 会更自然。另一方面,PUT对使用GET时将返回303 See Other
的URI没有意义。
您认为解决此类图表清单的最佳方式是什么?我不喜欢简单地改变LP数据集中的ranking
属性的解决方案,因为这可能以无意义的状态结束,例如具有相同排名的两个LP等等。
答案 0 :(得分:1)
我看到两个问题。 1.设计API的最RESTful(漂亮)方式是什么? 2.我如何确保两个LP没有获得相同的排名?
1: 你的LP可能有几个相对于彼此的属性,例如不同图表上的不同排名。我想说你希望排名超出你的LP资源。将排名保持在特定列表中作为单独的资源。例如:
2:这与休息无关,无论您如何设计API,都会遇到这个问题。交易是一种解决方案。
答案 1 :(得分:0)
您的音乐服务中有两个收藏资源。因此,我会设计一个这样的URI结构:
/ => returns links to collections (ergo itself a collection resource)
/releases => returns a list of LPs
/chart => returns the top 10 LPs, or redirects to the current chart URI
您可以POST
向/releases
添加新LP,PUT
或PATCH
添加到/chart
以定义新图表或更改当前图表。您将需要定义在每种情况下传输的表示格式。
这使您可以灵活地定义类似于/chart/2012-12-25
的思考,以显示2012年圣诞节时的图表。
我不建议使用PUT /chart/{position}
在特定位置插入LP并将其他所有内容拖放。 Intermediarys不知道该URI的PUT会导致其他资源更改其URI。这对于缓存很不好。
此外,作为用户,我希望你避免使用“广告牌”这个词,正如另一个答案所暗示的那样。一个广告牌让人联想到广告囤积的头脑图片,而不是排名图表!