这个标题有很多问题,但阅读完之后我不认为他们中的任何一个都能回答我的问题。
我正在设计我喜欢称之为" RESTful Internet Jukebox"。基本上,它是一个RESTful api,可以通过搜索查询与各种互联网音乐服务(如youtube)联系,下载音乐,并将其添加到MPD播放列表。我已经实现了原型并且工作得很好,但我不喜欢我的API设计,特别是关于播放列表管理。
就像现在一样,我有一个播放列表端点," GET"和" PUT"启用。现在,get返回每首歌曲的JSON表示列表(已保存歌曲的文件名及其长度)。 Put允许您,如果您知道所有已保存音乐的文件名,请放置这些JSON表示的列表并替换当前播放列表。
我想要的是让每个歌曲资源通过它在当前播放列表中的位置来识别,并且能够单独地获取/删除它们。我的问题在于,如果我删除资源ID 5(播放列表中的第5首歌曲),那么第6首歌曲将向上移动到第5位并成为该资源。随着播放列表的移动,显然这些ID会移动。这对我来说听起来不太安宁。我觉得如果你删除一个资源,除非你把东西放在那里,否则它不应该被重新填充。这是可以原谅的吗?是否有更好的方式以更加安静的方式处理播放列表管理?
提前感谢您的帮助!
答案 0 :(得分:0)
如果在列表之间没有插入任何项目或从列表中删除,则序列只会是您使用上面列表的有效标识符。将订单维护为每个项目的额外属性并提出另一种身份机制更为可行。
我认为您可能需要提出另一种方法来识别播放列表中的曲目,或许guid
或uuid
就足够了。如果您希望在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}
这将是一个明确的开始,然后您可以逐渐发展。