如何在没有资源 ID 的情况下为 GET 和 DELETE 正确请求 REST API?

How to request REST API correctly for GET & DELETE without resources ID?

如有误解请告知

获取所有活跃用户

GET /api/users?active

如果我想获取所有活跃用户的消息怎么办

GET /api/users/active/messages

或者如果我想删除所有活动用户的消息怎么办

DELETE /api/users/no-active/messages

不同的方法可以有相同的路线: 删除(DELETE)还是可以的:

DELETE /api/users/active/messages

How to request REST API correctly for GET & DELETE without resources ID?

从REST的角度来看,这个问题意义不大。任何命名信息都可以是 resource,我们使用资源标识符(又名 URI)来标识我们正在谈论的资源。

GET /api/users?active

在此查询中,/api/users?active 是资源标识符(RFC 7230 指的是 request-target 以原始形式表示)。

您的资源,在本例中是“所有活跃用户”,或者更准确地说是“所有活跃用户列表”;该列表的表示将随着时间的推移而变化,具体取决于当前活跃的用户。

GET /api/users/active/messages

同样的想法,资源是消息列表。

现在通常当我们尝试修改资源时,我们使用资源的标识符作为更改的目标 uri。因此对消息列表的修改将共享一个共同的目标 uri

POST /api/users/active/messages
PUT /api/users/active/messages
PATCH /api/users/active/messages
DELETE /api/users/active/messages

这是因为 URI 用作缓存键,熟悉 HTTP 缓存语义的通用组件将知道 invalidate 任何先前缓存的资源表示。

在 HTTP 中,DELETE has a precise semantic meaning, which is to remove the association between the identifier and its representations. The natural consequence of a successful DELETE is that a subsequent GET would return a 404 Not Found(这意味着请求的 target-uri 没有当前表示)。

如果您打算修改表示,那么 POST/PUT/PATCH 是更自然的选择。

PUT /api/users/active/messages
Content-Type: application/json

[]

是一条消息,意思是“用这个替换您当前的表示”。

当您的实现只是一个文档存储时,将一种表示替换为另一种表示非常简单 - 您验证传入的表示,然后用新的表示覆盖旧的表示。使用动态生成的表示,支持相同的语义需要做更多的工作。

POST 向资源发出“删除所有消息”请求,而不是尝试 PUT 新表示,这可能会大大减轻您的负担。