为嵌套资源设计rest api

问题描述

我的系统中有以下资源 1. 服务 2. 功能具有以下 JSON 结构的功能

{
 id: "featureName",state: "active",allowList: [serviceID1,serviceID2],denyList: [serviceID3,serviceID4]
}

我正在尝试更新由 serviceID 组成的 allowList 或 denyList 并考虑使用 PATCH 方法来执行如下操作,

/features/{featureId}/allowlist 
/features/{featureId}/denylist 
/features/{featureName}/state/{state}

我的第一个问题是我是否应该在 url 中包含许可名单、状态、拒绝名单,因为我的资源是服务和功能,而不是许可名单或拒绝名单。

rest 端点应该是什么样子的?
阅读下面提到的线程后,我正在考虑如下重组网址,

/features/{featureId}

[
    { "op": "add","path": "/allowList","value": [ "serviceA","serviceB"]},{ "op": "update","path": "/state","value": false}
]

最后,在这里使用 PATCH 是否合理?或者有更好的方法来设计 api。

注意:我从线程 REST design for update/add/delete item from a list of subresources 得到了一些帮助,但不经常使用补丁。

解决方法

rest 端点应该是什么样子的?

用于编辑(PUT、PATCH)资源的 URI 应该与用于读取(GET)资源的 URI 相同。这种设计的动机是cache-invalidation;您成功的写入会自动使之前缓存的相同资源(相同 URI)的读取无效。

最后,在这里使用 PATCH 是否合理?或者有更好的方法来设计 api。

在此示例中,文档的表示与 HTTP 标头相比较小,并且您的补丁文档的大小接近资源表示的大小。如果这是典型情况,我会倾向于使用 PUT 而不是 PATCH。 PUT 具有 idempotent 语义,通用组件可以利用这些语义(例如,当对较早请求的响应在网络上丢失时自动重新发送请求)。


GET /features/1 by user1 
PUT /features/1 //done by user 2 
PUT /features/1 //done by user1 

user2 的 PUT 对 user1 不可见,user1 将更新旧对象的状态(id=1)在这种情况下可以做什么?

Conditional Requests

您这样安排:(a) 来自服务器的 GET 请求包含标识表示的 validators (b) 服务器在请求缺少条件标头时响应 428 Precondition Required (c) 客户端知道从资源元数据中读取验证器,并在提交 PUT 请求时使用正确的条件标头 (d) 服务器知道在接受新表示之前将验证器与当前表示进行比较。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...