2016-12-07 61 views
1

用戶可以對REST資源具有不同的權限。像刪除或編輯資源一樣。此外,子資源可以具有不同的用戶權限。顯示REST資源的用戶權限和狀態

例子:

GET /cats -> return all cats 
GET /cats/{id} -> return cat {id} 
UPDATE /cats/{id} -> update cat {id} 
POST /cats/{id}/like -> create a like to the cat {id} 
DELETE /cats/{id}/like -> delete your like to the cat {id} 

當用戶請求一個貓的資源我想向他出示權限(允許的操作)和對象的狀態。

在這個例子中:

  1. 是用戶允許更新貓嗎?
  2. 用戶被允許喜歡貓嗎?
  3. 用戶是否已經喜歡貓?

我們的UI應該使用這些信息來顯示允許的操作爲對象:

  1. 更新按鈕
  2. Like按鈕
  3. 不喜歡按鈕

我怎樣才能添加此信息到我的資源迴應。應該可以將信息添加到一個資源,但也可以添加到對象列表。

我想過所有允許的操作的http頭中的鏈接。但是這隻對一個對象是可能的。他們是更好的解決方案嗎?

回答

1

我不明白爲什麼你不能在包含集合的響應頭中包含集合專用鏈接。我會告訴你,這是不可能的,但它似乎應該是一種選擇。

另一種選擇是在響應數據周圍使用信封。這可以讓您在集合級別包含元數據,包括鏈接。

GET /cats?owner=12 
{ 
    "totalRecords": 2, 
    "links": [ ... ], 
    "records": [ ... ] 
} 

EDIT(基於評論)

你應該在links屬性添加到cat表示,無論是作爲一個信封或作爲直接財產。所以,你的貓會是什麼樣子:

GET /cats/354 
{ 
    "name": "Poke", 
    ..., 
    "links": [ 
     { "rel": "like", "href": "/cats/12/like" }, 
     .... 
    ] 
} 

那麼,你的集合中的每個cat將具有與其相關聯的相關鏈接。這是使用link標題的普遍接受的替代方法。

變化:

  • 有些人喜歡,包括在鏈路資源的動詞,如{ "rel": "like", "verb": "POST", "href": "/cats/12/like" }
  • 有些人喜歡做裁判的鏈接屬性的名稱,如"links": { "like": "/cats/12/like", "delete": "/cats/12" }
+0

如果我將100只貓作爲一個集合返回,那麼在標題鏈接中會有100 *個允許的操作。這不可能是最佳做法嗎? – user1482309

+0

@ user1482309哦,我明白你在說什麼了。我會編輯我的回覆。 –

+0

謝謝埃裏克。我將討論這個想法。 – user1482309