一个restful服务API设计问题

一个restful服务API设计问题,rest,wcf-rest,restful-architecture,Rest,Wcf Rest,Restful Architecture,关于restful服务API设计的一个问题。我不知道怎样做才是正确的方法。请给我一些建议 我的情况是这样的。我有一个用户资源和权限资源 http://www.sample.com/rest/users http://www.sample.com/rest/permissions 用户可以拥有多个权限;一个权限可用于多个用户;这是一种多对多的关系 通常,我们可以说权限属于用户,因此我们有一个API,如: http://www.sample.com/rest/users/{userId}/perm

关于restful服务API设计的一个问题。我不知道怎样做才是正确的方法。请给我一些建议

我的情况是这样的。我有一个用户资源和权限资源

http://www.sample.com/rest/users
http://www.sample.com/rest/permissions
用户可以拥有多个权限;一个权限可用于多个用户;这是一种多对多的关系

通常,我们可以说权限属于用户,因此我们有一个API,如:

http://www.sample.com/rest/users/{userId}/permissions
当我们想要在权限和用户之间建立关系时,这里有两个选项

  • 我们可以先使用POST:
    http://www.sample.com/rest/permissions
    使用权限正文,然后发布:
    http://www.sample.com/rest/users/{userId}/permissions
    带有一个集合 权限ID的数量。我不确定是否还有其他RESTAPI 像这样设计

  • 我们只能使用一个API,如:
    http://www.sample.com/rest/users/{userId}/permissions
    带有 权限对象内容。在这个方法中,我们做两件事 选项1中的描述。缺点是我们永远不能重复使用 已创建权限,看起来一个用户可以有多个 权限,但一个权限仅由一个用户使用,它遵守 我们的第一次设计。但它对用户来说非常简单


  • 如果您对此有任何经验,欢迎提供任何建议

    如果权限对象足够复杂,看起来像一个单独的实体(或者需要在用户之间共享权限对象),我会使用单独的权限URL。如果权限“对象”只是一个
    rwx
    字符串或类似的东西,那么不值得引入独立实体。另一方面,如果权限对象更复杂(例如,与文件夹列表关联的权限列表),则将其存储为单独的实体并使用单独的URL可能是有意义的。

    如果权限对象足够复杂,看起来像单独的实体,我将使用单独的权限URL(或者如果您需要在用户之间共享权限对象)。如果权限“对象”只是
    rwx
    字符串或类似的东西,则不值得引入独立实体。另一方面,如果权限对象更复杂(例如与文件夹列表相关联的权限列表),将其存储为单独的实体并使用单独的URL可能是有意义的。

    另一种方法是将用户和权限视为单独的“空间”或资源。您应该能够使用单独的URL单独管理它们

    创建用户

    • POST:/users/
    • 返回:{userid}
    创建权限的步骤

    • POST:/permissions/
    • 返回:{permid}
    然后谈到映射,您应该使用PUT,因为它不是创建新资源,而是映射这两个资源

    将用户添加到权限空间

    • PUT:/permissions/users/{userId}/
    或将用户添加到权限空间

    • PUT:/permissions/用户/
    • 正文:{[userid1,userid2,…]}
    向用户空间添加权限

    • PUT:/users/permissions/{permId}/
    或向用户空间添加权限

    • PUT:/users/权限
    • 正文:{[permid1,permid2,…]}

    另一种方法是将用户和权限视为分离的“空间”或资源。您应该能够使用单独管理它们

    创建用户

    • POST:/users/
    • 返回:{userid}
    创建权限的步骤

    • POST:/permissions/
    • 返回:{permid}
    然后谈到映射,您应该使用PUT,因为它不是创建新资源,而是映射这两个资源

    将用户添加到权限空间

    • PUT:/permissions/users/{userId}/
    或将用户添加到权限空间

    • PUT:/permissions/用户/
    • 正文:{[userid1,userid2,…]}
    向用户空间添加权限

    • PUT:/users/permissions/{permId}/
    或向用户空间添加权限

    • PUT:/users/权限
    • 正文:{[permid1,permid2,…]}
    资源 首先,让我们讨论一下您将拥有哪些“资源”和“集合”

    • /users
      /permissions
      这是一个很好的简单的开始,它们分别是所有用户和所有权限的集合
    • /users/{id}
      /permissions/{id}
      ,它们分别是用户或权限的单个资源。
      • 用户可能有“姓名”、“注册日期”、“id”等字段
      • 权限可能包含“名称”、“创建日期”、“id”等字段
    到目前为止,这两种资源都很简单。不管你从这里走到哪里,这两种资源仍然作为独立实体存在,用户可以没有权限,权限可以没有用户。但现在我们需要将它们联系在一起?首先,让我们展示一个概念,它的简单性似乎让大多数人大吃一惊

    /users/{id}/name
    可用于根据id仅返回用户名。您不必支持此行为,如果支持,则不应直接将用户名作为“user”资源的一部分返回(您应链接到此特定名称资源)

    这个概念也可以应用于权限。因此,我们还添加了
    /users/{id}/permissions
    ,既可以将其作为一个资源调用
    GET
    ,也可以作为一个“链接”,它位于通过
    /users/{id}
    获取的资源中(因此html的超链接部分开始被使用).那么这是什么回报呢?可能是这样的:

    /permission/3
    /permission/666
    /permission/7
    
    这些资源是否在用户的“下方”,否。它们是否需要,否。因此,如果您
    获取这些权限资源中的一个,该怎么办

    name=admin
    id=666
    created-date=12/3/45
    users=/permission/666/users
    
    我们走了,有了那辆车
    { "name" : "Frank",
      "permissions" : [
        ...
      ]
    }