显示REST资源的用户权限和状态

时间:2016-12-07 05:34:50

标签: web-services rest api restful-architecture

用户可以拥有对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}

当用户请求cat资源时,我想向他显示权限(允许的操作)和对象的状态。

在这个例子中:

  1. 是否允许用户更新猫?
  2. 是否允许用户喜欢这只猫?
  3. 用户是否已经喜欢猫?
  4. 我们的UI应该使用此信息来显示对象的允许操作:

    1. 更新按钮
    2. 赞按钮
    3. 不喜欢按钮
    4. 如何将此信息添加到资源响应中。应该可以将信息添加到一个资源,也可以添加到对象列表。

      我想到了所有允许操作的http标头中的链接。但这只能用于一个物体。他们是更好的解决方案吗?

1 个答案:

答案 0 :(得分:1)

我不清楚为什么你不能在包含该集合的响应的标题中包含特定于集合的链接。我会告诉你,那是不可能的,但似乎它应该是一种选择。

另一种选择是在响应数据周围使用信封。这将允许您在集合级别包括元数据,包括链接。

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

编辑(基于评论)

您应该将links属性添加到cat表示中,作为信封或直接属性。所以你的猫看起来像:

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

然后,您收藏中的每个cat都会有与之关联的相关链接。这是使用link标头的普遍接受的替代方法。

变体:

  • 有些人喜欢在链接资源中加入动词,例如{ "rel": "like", "verb": "POST", "href": "/cats/12/like" }
  • 有些人喜欢将ref作为链接属性的名称,例如"links": { "like": "/cats/12/like", "delete": "/cats/12" }