带有过滤的 HTTP PUT 仍然是幂等的吗?

Is HTTP PUT with filtering still idempotent?

我正在开发一项 restful 服务,但我不确定我所做的是否是有效的 HTTP。我了解如何使用以下 HTTP 方法:GET、DELETE 和 POST,但在支持 PUT 时,我不太确定。我知道 PUT 是幂等的,但如果我要使用过滤呢?

为清楚起见,如果您要使用我的服务,您可以:

GET /User

这将列出所有用户。

GET /User/1

这将获得 ID 为 1 的用户。

POST /User

这将创建一个新用户。

PUT /User/2

这将创建一个 ID 为 2 的新用户,如果该用户已经存在,将更新该用户。

我开始挣扎的地方是当我想对 PUT 请求实施过滤时。例如,我允许:

PUT /User?FirstName=Andrew&LastName=Schools

这将更新 FirstName 为 Andrew 和 LastName 为 Schools 的资源。此外,您还可以:

PUT /User?status=1

这将使用请求正文中的内容更新状态为 1 的任何用户。

我的问题是,因为我在 PUT 上启用过滤,这仍然是幂等的吗?我最初的想法是不,因为你第一次使用上面的过滤器 PUT 时,这可能会改变相同的过滤器在后续 PUT 中找到的内容,因此,它不是幂等的。如果上面的说法确实是真的,这个功能在 POST 中会更好吗?

我没发现问题。相关的是资源的最终状态。如果您应用 PUT 两次,并且在第二次请求时过滤器识别的资源较少或没有,它是否会更改您确实想要修改的资源的状态?