以RESTful方式处理有序列表

时间:2012-03-23 18:49:52

标签: rest

我怀疑在RESTful API中解决有序列表的最佳方法是什么。想象一下下面的例子:让我们创建一个LP的图表列表,你想要添加新的LP,删除那些不在TOP10中的LP,并改变它们的位置。您将如何在RESTful JSON-API中实现这些方法?

我想到了以下方式:

  • GET / 返回有序图表列表,如[{ "name": "1st-place LP", "link": "/uid123" }, { "name": "2nd-place LP", "link": "/uid987" }, ...]
  • GET / {uid} 以唯一ID返回LP,返回某事。像{"name": "1st-place LP", "ranking": 1 }
  • 获取/排名/ {position} 以便访问,例如当前排名第一的LP,返回303 See Other,其位置标题为Location: /uid123
  • POST / ,请求正文{ "name": "my first LP title" }创建新的LP而不指定其当前的图表位置

现在问题是我们如何改变当前的图表位置?可以简单地 PUT / {uid} 来更新ranking属性,但我认为 PUT / ranking / {position} 会更自然。另一方面,PUT对使用GET时将返回303 See Other的URI没有意义。

您认为解决此类图表清单的最佳方式是什么?我不喜欢简单地改变LP数据集中的ranking属性的解决方案,因为这可能以无意义的状态结束,例如具有相同排名的两个LP等等。

2 个答案:

答案 0 :(得分:1)

我看到两个问题。 1.设计API的最RESTful(漂亮)方式是什么? 2.我如何确保两个LP没有获得相同的排名?

1: 你的LP可能有几个相对于彼此的属性,例如不同图表上的不同排名。我想说你希望排名超出你的LP资源。将排名保持在特定列表中作为单独的资源。例如:

  • GET / LPuid仅返回有关LP的属性,而不返回相关属性,例如排名
  • GET / billboard / 3将URI返回给广告牌列表中排名为3的LP。
  • PUT /广告牌采用100 LP URI的文档。
  • PUT / billboard / 3在该排名中插入一个LP URI并将其他排名移动。

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,PUTPATCH添加到/chart以定义新图表或更改当前图表。您将需要定义在每种情况下传输的表示格式。

这使您可以灵活地定义类似于/chart/2012-12-25的思考,以显示2012年圣诞节时的图表。

我不建议使用PUT /chart/{position}在特定位置插入LP并将其他所有内容拖放。 Intermediarys不知道该URI的PUT会导致其他资源更改其URI。这对于缓存很不好。

此外,作为用户,我希望你避免使用“广告牌”这个词,正如另一个答案所暗示的那样。一个广告牌让人联想到广告囤积的头脑图片,而不是排名图表!