我正在为域管理员设计一个API,专门用于管理用户cookie会话
GET users/{userKey}/sessions
获取用户所有会话的列表
DELETE users/{userKey}/sessions/{sessionId}
删除用户的特定会话
我想向管理员公开另一种方法,以删除(重置)用户的所有会话。我正在考虑2个选项,我想知道哪个更宁静
DELETE users/{userKey}/sessions
-{sessionId}留空以删除所有会话POST users/{userKey}/sessions/reset
答案 0 :(得分:0)
这个答案可能是基于观点的,因此就这么认为。 如果您要删除资源(因为您将要删除会话),我会使用删除。
如果您保留会话(但更改了这些资源中的某些数据,例如滑动过期),那么我将考虑在修改时使用 PATCH (重置而不是替换) )现有的会话。
答案 1 :(得分:0)
REST从未设计用于批量事务支持,而是用于表示单个对象的状态。也就是说,API设计非常有根据,您必须在REST“纯净”与功能之间取得平衡。如果要进行此设计,我将使用选项1并在“会话”端点上使用delete,因为您要删除所有用户会话,而不仅仅是单个或子集。
答案 2 :(得分:0)
我会选择DELETE @ users/sessions
如果您考虑一下,重设只是管理员放弃会话。当用户返回时,他们将获得新会话。因此,重新设置路由没有太大意义,因为您在此操作中不会向所有用户重新发布会话。
我的偏好是users/sessions
,而不是users/{*}/sessions
。后面的路由建议您要删除父资源的所有会话,在这种情况下,是单个用户。
答案 3 :(得分:0)
我想向管理员公开另一种方法,以删除(重置)用户的所有会话。我正在考虑2种选择,我想知道哪一种更宁静。...
您可能想使用POST。
POST在HTTP中有许多有用的用途,包括“此操作不值得标准化”的一般用途。 -Fielding, 2008。
HTTP DELETE通常不是正确的答案
相对而言,很少有资源允许使用DELETE方法-它的主要用途是用于远程创作环境,在该环境中用户对其效果有所了解。 -RFC 7231
HTTP方法属于“通过网络传输文档”域,而不属于您的域。
REST实际上并不关心target-uri的拼写-这就是重点。通用HTTP组件不假定uri编码有任何特定的语义。它只是一个不透明的标识符。
这意味着您可以应用任何您喜欢的URI设计启发式方法。这很像为通用编程语言选择变量名或命名空间。编译器/解释器通常不关心符号是否“意味着”任何东西。我们选择的名称使与代码互动的人类变得更容易。
URI也是如此。您可能需要使用与API中其他标识符一致的拼写,以便使该API看起来像是“一心一意”设计的。
一种常见的方法是从一个概念开始,即资源是可以命名的任何信息(Fielding, 2000)。因此,我们的工作是首先(a)找出处理此请求的资源的名称,然后(b)找出一个与该名称“匹配”的标识符。资源与 documents 非常相似,因此,如果您能想到要在其中编写此消息的文档的名称,则是找出名称的好方法(例如:我们编写过期的会话进入“安全日志”或“会话日志”。很好,现在找出相应的URI。)
如果我跑了动物园:我想是
GET /users/{userKey}/sessions
可能会返回用户cookie会话的表示。因为这种表示形式会在我们删除所有用户会话时发生变化,所以我想将删除请求发布到该相同的目标URI
POST /users/{userKey}/sessions
因为这样可以简化cache invalidation的故事。