2014-02-25 187 views
3

我正在構建一個RESTful API,將我的應用程序用戶公開爲usersRESTful API:建模可訪問其他資源的資源集合

我的應用程序還具有「文檔」功能,每個用戶都可以訪問特定的文檔。我正在考慮通過users/{user-id}/documents公開可訪問文檔來自然地表達這一點。

但是,從可用性的角度來看,重要的是我的客戶能夠獲取(並修改)有權訪問特定文檔的用戶。正因爲如此,我正在考慮將這種表示「逆轉」到documents/{document-id}/users

這些(特別是後者)是否看起來像正確的方式來模擬這種關係?如果我確實採用這樣的解決方案,我該如何建模'授予對文檔的訪問權限'?

我傾向於將預先存在的用戶(大概是通過獲取users獲取)轉換爲documents/{document-id}/users/{user-id}。然而,這似乎並不令人滿意,因爲我將執行「更新」操作,而不是實際更新資源,而是將其插入集合中。這在語義方面尤其成問題,因爲我期望我的服務器端最終不會考慮完整的已發送用戶表示,而只是將id與預先存在的用戶的id進行交叉引用,以創建關聯。

在另一方面,我不能發佈到documents/{document-id}/users,因爲我不是在創造一個新的資源的目標 - 我特別想要一個被創建。

我做錯了嗎?

+1

的可能的複製[如何處理在一個RESTful API許多一對多的關係?] (http://stackoverflow.com/questions/6324547/how-to-handle-many-to-many-relationships-in-a-restful-api)(儘管我仍然會對PUT/POST語義如何感興趣進入這個數字) – biril

回答

1

用戶並不真正屬於文檔資源,對吧?你真正說的是這些用戶有權訪問這個文檔。因此,可能從/ documents/{document-id}/users返回的內容不是用戶實體的直接表示,而是某種用戶對該實體的權限表示。也許在該表示內部是完整用戶本身的鏈接。

所以,如果你正在返回集合+ JSON媒體類型,也許你會碰到這樣的:

{ 
    "collection": 
    { 
    "version":"1.0", 
    "href":"/documents/document123", 
    "items": 
    [ 
     { 
     "href":"/documents/document123/users/user3841", 
     "data": [ 
        { "name":"userName", "value":"John Doe", "prompt":"User Name" }, 
        { "name":"permissions", "value":["Read"], "prompt":"User Permissions" } 
       ],   
     "links": [ 
        { "rel":"user", "href":"https://stackoverflow.com/users/3841" } 
        ] 
     }, 
     { 
     "href":"http//whatever/documents/document123/users/user9387", 
     "data": [ 
        { "name":"userName", "value":"John Doe", "prompt":"User Name" }, 
        { "name":"permissions", "value":["Read"], "prompt":"User Permissions" } 
       ],   
     "links": [ 
        { "rel":"user", "href":"https://stackoverflow.com/users/9387" } 
        ] 
     } 
    ] 
    } 
}