2014-12-02 195 views
3

之間語境採取以下URI的爲例:REST:孩子和家長

/tracks 
/tracks/:id 
/playlists 
/playlists/:id 
/playlists/:id/tracks 

我有一個關於最後一個問題,URI(/播放/:ID /曲目)。如何將額外信息/上下文添加到與其父播放列表相關的跟蹤對象?上下文

例子:

  1. 上架時間的軌道到播放列表中曲目的播放列表中
  2. 遊戲計數每磁道
  3. 喜歡的播放列表中

所有曲目有一個創建的時間戳,玩數和喜歡在全球範圍內。所以我的問題是如何將這些信息添加到端點的響應中。

我已經想出了以下現在:

{ 
    "title" : "harder better faster stronger", 
    "artist" : "daft punk", 
    "likes" : 234252, 
    "created_at" : "2012-10-03 09:57:04" 
    "play_count" : 1203200035, 
    "relation_to_parent": { 
     "likes" : 5, 
     "created_at" : "2014-11-07 19:21:64", 
     "play_count" : 20 
    } 
} 

我添加了一個域名爲relation_to_parent它增加了一些方面對孩子之間的關係,它的父。我不確定如果這是一個好辦法。希望聽到其他解決方案。

回答

0

如果您想完全接受RESTful服務設計原則,您一定希望在您的表示格式中使用超鏈接。 JSON有一些現有的規格,如果你不想拿出自己的:HALJSON API。一個天真的超媒體格式可能是這樣的:

{ 
    "playlist_id" : "666", 
    "created_at" : "2014-11-07 19:21:64", 
    "likes" : 5, 
    "tracks" : [ 
     {"index" : 1, 
     "begin_at" : "00:02:00", 
     "end_at" : "00:05:23", 
     "_links" : {"track" : { 
      "href" : "/tracks/123", 
      "type" : "track"}}}, 
     {"index" : 2, 
     "_links" : {"track" : { 
      "href" : "/tracks/432", 
      "type" : "track"}}}, 
     {"index" : 3, 
     "_links" : {"track" : { 
      "href" : "/tracks/324", 
      "type" : "track"}}}, 
     {"index" : 4, 
     "_links" : {"track" : { 
      "href" : "/tracks/567", 
      "type" : "track"}}}] 
} 

更復雜的功能都包含在這兩個HAL和JSON API,就像定義嵌入的資源和鏈接樣板。使用這樣的語義,你可能會像下面這樣結束:

{ 
    "id" : "666", 
    "created_at" : "2014-11-07 19:21:64", 
    "likes" : 5, 
    "tracks" : [ 
     {"id" : "123", 
     "index" : 1, 
     "begin_at" : "00:02:00", 
     "end_at" : "00:05:23"}, 
     {"id" : "432", 
     "index" : 2}, 
     {"id" : "324", 
     "index" : 3}, 
     {"id" : "567", 
     "index" : 4} 
    ], 
    "_links" : { 
     "_self" : { 
      "href" : "/playlists/666", 
      "type" : "playlist"}, 
     "tracks" : { 
      "href" : "/tracks/{id}", 
      "type" : "track"} 
    }, 
    "_embedded" : { 
     "track" : [ 
      {"id" : "123", 
      "title" : "harder better faster stronger", 
      "artist" : "daft punk", 
      "created_at" : "2012-10-03 09:57:04", 
      "likes" : 234252, 
      "play_count" : 1203200035}, 
      {"id" : "432", 
      "title" : "aerodynamic", 
      "artist" : "daft punk", 
      "created_at" : "2009-03-07 11:11:11", 
      "likes" : 33056, 
      "play_count" : 8796539} 
     ] 
    } 
} 

另外,不要忘了使用超鏈接來表示實體之間的靜態關係是旅程纔剛剛開始。使用Hypermedia As The Engine Of Application State是真正的涅ana ......但是那時你可能會瞄準太高。

+0

今天我一直在閱讀關於大廳的更多信息。但在你的例子中,我沒有看到我提到的三個上下文是如何適合的。我在哪裏可以看到播放列表中的曲目數量?或者當軌道被添加? – Boedy 2014-12-03 10:41:48

+0

您提到的「上下文」在那裏。在「軌道」下的列表中,每個對象都有一個「索引」,第一個有'begin_at'和'end_at'。這些鍵在'track'資源本身的外部,這是一個單獨的,並且使用'link'定義中的URL模板來引用。 – 2014-12-05 11:33:57

1

我不認爲有這樣做的「一個真正的方法」。就我個人而言,我不喜歡添加這樣的額外信息,因爲當您正在尋找資源時,您正在提供資源加。無論如何,「喜歡」,「created_at」和「play_count」實際上是與父母關係的一部分,是不是它們本身的一部分?

這兩個路徑我經常看到這樣的:

  1. /playlist/:id/tracks - 返回ID(或URL)的實際的曲目列表,然後您可以用/tracks/:track
  2. /playlist/:id/tracks取 - 返回實際的軌道,就好像你在上面的1中一樣。

至於更多的信息,如果不是軌道的一部分,你可能會做它(任何這些是有效的):

  • 信息作爲軌道的一部分,所以/tracks/:track總是返回'play_count'和'likes'等
  • 單獨的信息,即它自己的資源,如果你想保持軌道乾淨。所以,你可能會在/tracks/:track/social_info得到它也許/social_info/:track它的軌道ID 1對1

如果你有實際關係信息相匹配,那就要看它是否是1:1或1:N或N: 1或N:N。 1:1或1:N或N:1,您可能會將其報告爲資源本身的一部分,而N:N可能是資源的一部分(JSON對象可能具有深度)或作爲單獨的資源。

就個人而言,我已經完成了上述所有內容,並且發現清潔更好,即使是多次檢索。但是,現在我們深入研究的意見....

編輯:

有很多方法可以做到N:N,下面就介紹幾種:

  • /playlist/:id/tracks/:track/social_info - 它可以嵌入或另一個對象
  • /social_info/:playlist鏈接 - 更直接
  • /social_info/playlist/:id如果你可能有不同的社會信息的

個人(再次有這個詞;這很大程度上是個人偏好和意見),時間我已經嘗試過使用更深的路徑,思考的東西只有在父上下文有意義,我發現自己結束了自己的資源,並鏈接回來,所以第二個或第三個選項最終成爲我所做的事情,首先鏈接到它(方便地檢索它或檢索它的列表)。大多數情況下,這並不是因爲服務器端的限制 - 例如,當我使用nodejs編寫代碼時,我使用http://github.com/deitch/booster,它很容易處理到同一資源的多條路徑 - 但由於客戶端框架通常在一條真實路徑上運行得更好。

+0

是的,'likes','created_at'和'play_count'是曲目本身的一部分。但我也想顯示關於父級的'likes','created_at'和'play_count'。例如:曲目總共可以播放1000次,但在播放列表1中只播放一次。這是N:N關係。也許我應該創建一個單獨的資源。 – Boedy 2014-12-03 10:47:17

+0

好吧,我明白了。而'喜歡'等可能會或可能不會成爲賽道的一部分。該軌道可能是自己的資源,而喜歡這個軌道的* my *喜歡。它是更多的元數據。在任何情況下,是的,我會讓那個N:N – deitch 2014-12-03 10:49:16

+0

不是你喜歡的,而是喜歡這個音軌的人在這個播放列表中的數量。所以是的,播放列表和音軌是他們自己的資源,可以獨立存在。所以如果你打電話給這個元數據。這將如何納入迴應?也許你可以更新你的答案? – Boedy 2014-12-03 10:56:00

1

通過1:n關係你可以定義一個子資源。通過n:m關係,最好定義一個單獨的關係資源。請注意,這些只是最佳做法,而不是標準。

請注意,您可以添加指向其他資源的鏈接。根據HATEOAS約束,如果要公開某個操作(例如獲取其他資源),則必須創建超鏈接。