PUT /companies/A
{
"name": "B"
}
将会返回 HTTP 301
状态码,同时带有 Location
头指向公司的新 URI:/companies/B
。
如何使此操作具有幂等性,无论是否使用 If-Match
请求头?
不使用
If-Match
请求头:如果用户试图重命名一个不存在的公司,则服务器应该返回HTTP 404
状态码。但这样做会导致合法的重命名操作不具有幂等性(第一次返回301
,之后返回404
)。这是有问题的,因为我希望客户端能够区分重命名失败(公司不存在)和已经重命名过的情况。使用
If-Match
请求头:如果公司的ETag
值依赖于公司名称,则后续的重命名操作将失败,因为前提条件不再成立。同样,这会让操作看起来像是失败了,而实际上已经执行成功。
GET /companies/{name}
重定向到/companies/{id}
,并且只允许在后者上进行PUT
操作。这样,GET
和PUT
都是幂等的。 - Gili