2014-02-25 141 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" } 
        ] 
     } 
    ] 
    } 
}