如前所述,包括专辑是有意义的。尽管在某些情况下第三点(带有相对URI)可能很有趣(您不必考虑URI的形成方式),但它的缺点是没有明确提供专辑。第四点纠正了这一点。如果您看到在响应中包含相对URI的好处,则可以将点3和4相结合。
选择好的URI不是一件容易的事,特别是因为没有一个正确的答案。如果您与API同时开发客户端,则可以帮助您更好地可视化如何使用API。话虽这么说,然后其他人可能会喜欢您在开发API时没有想到的其他用法。
GET /albums/:albumId
返回一个JSON,其中包含有关专辑的元信息(例如发布该专辑的年份或显示专辑封面的JPEG的URI)和一个曲目数组。例如:
GET /albums/151
{
"id": 151,
"gid": "dbd3cec7-b927-423f-894b-742c4c7b54ce",
"name": "Yellow Submarine",
"year": 1969,
"genre": "Psychedelic rock",
"artists": ["John Lennon", "Paul McCartney", ...],
"tracks": [
{
"id": 90224,
"title": "Yellow Submarine",
"length": "2:40"
},
{
"id": 83192,
"title": "Only a Northern Song",
"length": "3:24"
}
...
]
}
例如,为什么要包括每个音轨的长度?因为我想象显示专辑的客户可能会对按标题列出曲目感兴趣,但同时也会显示每首曲目的长度,大多数客户都会这样做。另一方面,我可能不会为每个曲目都显示作曲家或艺术家,因为我认为在此级别上不需要此信息。显然,您的选择可能有所不同。
GET /tracks/:trackId
返回有关特定轨道的信息。由于不再存在层次结构,因此您无需猜测专辑或艺术家:您真正需要知道的唯一是轨道本身的标识符。
甚至可能没有?如果可以使用名称指定它GET /tracks/:trackName
怎么办?
GET /tracks/Only%20a%20Northern%20Song
{
"id": 83192,
"gid": "8d9c4311-9d7b-40a4-8aeb-4fe96247fe2b",
"title": "Only a Northern Song",
"writers": ["George Harrison"],
"artists": ["John Lennon", "Paul McCartney", "Ringo Starr"],
"length": "3:24",
"record-date": 1967,
"albums": [151, 164],
"soundtrack": {
"uri": "http://audio.example.com/tracks/static/83192.mp3",
"alias": "Beatles - Only a Northern Song.mp3",
"length-bytes": 3524667,
"allow-streaming": true,
"allow-download": false
}
}
现在仔细看albums
; 你看到了什么?是的,不是一张,而是两张专辑。如果您具有层次结构,则不能这样做(除非您重复记录)。
GET /comments/:objectGid
。您可能在响应中发现了丑陋的GUID。这些GUID使得跨数据库识别实体成为可能,以执行可应用于专辑,艺术家或曲目的任务。如评论。
GET /comments/8d9c4311-9d7b-40a4-8aeb-4fe96247fe2b
[
{
"author": {
"id": 509931,
"display-name": "Arseni Mourzenko"
},
"text": "What a great song! (And I'm proud of the usefulness of my comment)",
"concerned-object": "/tracks/83192"
}
]
注释引用了相关的对象,从而可以在其上下文之外访问注释时(例如,通过审核最新注释时GET /comments/latest
)转到该对象。
SongSearchResult
,我想很好。但是URL是什么呢?我应该提供parentID
每个对象并将其用作GET参数还是url的正常部分吗?如果我的深度大于2怎么办?/artist/1/album/10/song/3/comment/23
-提供艺术家,专辑和歌曲的每一个ID都是很疯狂的comment
,但是我听说这是一个可行的方法,但是不是令人讨厌吗?