为嵌套资源设计RESTURI的最佳方法是什么

为嵌套资源设计RESTURI的最佳方法是什么,rest,nested,uri,Rest,Nested,Uri,假设有多个用户具有多个权限和多个授权 检索指定用户(无权限)的所有授权可以是: GET users/{id}/authorizations “正常”情况是,出于性能原因,不将权限嵌入到授权中 在某些情况下,必须返回授权及其对该用户的相应权限 建议的解决办法是: GET users/{id}/authorizations/permissions // does not seem clear GET users/{id}/authorizations?permissions=true

假设有多个用户具有多个权限和多个授权

检索指定用户(无权限)的所有授权可以是:

GET users/{id}/authorizations
“正常”情况是,出于性能原因,不将权限嵌入到授权中

在某些情况下,必须返回授权及其对该用户的相应权限

建议的解决办法是:

GET users/{id}/authorizations/permissions       // does not seem clear
GET users/{id}/authorizations?permissions=true  // with query string
GET users/{id}/authorizationswithpermissions    // new resource

现在,在这种情况下,设计REST URI的最佳方法是什么?

我个人认为最后两个建议都没有问题:

GET users/{id}/authorizations?permissions=true  // with query string
GET users/{id}/authorizationswithpermissions    // new resource
除非我将其更改为以下更相关的内容:

GET users/{id}/authorizations?withPermissions=true  // with query string
GET users/{id}/authorizationsANDpermissions    // new resource
第一个看起来很混乱,但是您的RESTful实体应该被记录在您选择的任何符号中

你的想法 在某些情况下,必须返回授权及其对该用户的相应权限

像这样嵌套集合资源不是一个好主意。这是否意味着“为我提供用户
id
的所有授权的所有权限”?这还不清楚不要这样做

GET users/{id}/authorizations?permissions=true
GET users/{id}/authorizationswithpermissions
查询通常用于查询、搜索或筛选集合资源。此URL将返回用户
id
的所有授权,其中
权限
true
。但那个人是干什么的?这还不清楚不要这样做

GET users/{id}/authorizations?permissions=true
GET users/{id}/authorizationswithpermissions
授权就是授权。它们的表示不应依赖于URI不要这样做。

内容协商 解决问题的方法是使用内容协商。您只使用一个URL:

这意味着:给我一个用户
id
的所有授权列表

现在,如果您想在没有权限的情况下获取此列表,可以使用HTTP头

Accepts: application/vnd.mycompany.authorizations+xml
Accepts: application/vnd.mycompany.authorizations.permissions+xml
让我们消化一下

  • application
    :普通MIME类型的第一部分
    application/xml
  • vnd
    :定义自己类型的前缀
  • mycompany.authorizations
    :您的类型
  • xml
    :应用程序/xml的第二部分
现在,如果您想获得具有权限的列表,可以使用HTTP头

Accepts: application/vnd.mycompany.authorizations+xml
Accepts: application/vnd.mycompany.authorizations.permissions+xml

请注意,我现在使用
vnd.mycompany.authorizations.permissions
。服务器应返回包括权限在内的授权。只有表示不同,资源不同。

查询参数通常用于筛选或搜索集合。因此,不建议使用
authorizations?permissions=true
。绝对同意,但在某些情况下,过滤可被视为扩展结果。Personnaly我将在99%的情况下避免这种方法:)“在某些情况下,过滤可以被视为扩展结果。”我无法想象任何这样的情况。感谢您建议使用资源的替代表示形式。它符合我的需要,并保持着休息的精神。有太多的表现可能是一种过度的杀伤力。我会使用内容协商,但我建议使用媒体类型参数来声明请求的粒度,而不是发明新的表示。e、 g.接受:application/json;级别=1或应用程序/json;级别=权限等。