RESTful API中的动态资源

时间:2014-11-14 20:36:55

标签: json api rest

这个标题有很多问题,但阅读完之后我不认为他们中的任何一个都能回答我的问题。

我正在设计我喜欢称之为" RESTful Internet Jukebox"。基本上,它是一个RESTful api,可以通过搜索查询与各种互联网音乐服务(如youtube)联系,下载音乐,并将其添加到MPD播放列表。我已经实现了原型并且工作得很好,但我不喜欢我的API设计,特别是关于播放列表管理。

就像现在一样,我有一个播放列表端点," GET"和" PUT"启用。现在,get返回每首歌曲的JSON表示列表(已保存歌曲的文件名及其长度)。 Put允许您,如果您知道所有已保存音乐的文件名,请放置这些JSON表示的列表并替换当前播放列表。

我想要的是让每个歌曲资源通过它在当前播放列表中的位置来识别,并且能够单独地获取/删除它们。我的问题在于,如果我删除资源ID 5(播放列表中的第5首歌曲),那么第6首歌曲将向上移动到第5位并成为该资源。随着播放列表的移动,显然这些ID会移动。这对我来说听起来不太安宁。我觉得如果你删除一个资源,除非你把东西放在那里,否则它不应该被重新填充。这是可以原谅的吗?是否有更好的方式以更加安静的方式处理播放列表管理?

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

如果在列表之间没有插入任何项目或从列表中删除,则序列只会是您使用上面列表的有效标识符。将订单维护为每个项目的额外属性并提出另一种身份机制更为可行。

我认为您可能需要提出另一种方法来识别播放列表中的曲目,或许guiduuid就足够了。如果您希望在UI中保留该行为,则序列可以是播放列表中每个播放列表项的属性。

答案 1 :(得分:0)

歌曲使用唯一标识符。 如果你创建一个新的歌曲,(通过POST),你为它分配一个序列号作为 id ,你将在服务器端执行此操作。

创建一个包含

的资源播放列表
Collection<Song> songs; // in class Playlist
歌曲的

。这些是从播放列表歌曲的一对多映射。

资源可能如下:

/playlist/1001/position/10

除此之外,你可以实现

.../playlist/1001/last , /playlist/1001/shuffle ,  ...

然后通过PUT使用位置,如:

PUT : /playlist/1001/position/10/song/2003

消费:

GET : /playlist/1001/position/10

甚至

 /playlist/1001/position/next

/playlist/1001/position/reset ...

您可以将其称为播放器,然后转到

/playlist/1001/player/reset

或将其放入请求正文中。

PUT: /playlist/1001      
  { "player" : "reset" }

PUT: /playlist/1001
  { "songId" : "3021_MYUIDSCHEMA" }

也许这个       &#34;前置&#34; :&#34; true&#34;

但是如果你实现这样的播放器。你的GET会有&#34;副作用&#34;玩家继续...或者你没有移动&#34;索引&#34;直到一个人

PUT: /playlist/1001
{ "skip" : "1", // for next or more
  "set" :: "10" // for direct set }

但是,单独使用

/playlist/xyz/positions/...

非常有意义。

将id作为序数编号并不是一个好主意。

简而言之:您有 2个选择

更改位置时更改实体的ID

(id: 5 becomes id: 4)
删除前期实体后

或者你改变位置

(positions[4]: 5 /*where it was before*/ positions[4]: {otherSongsId}

这将是一个明确的开始,然后您可以逐渐发展。