在休息时使用 GET 动词更新 api?

Using GET verb to update in rest api?

我知道 http 动词的使用是基于标准规范的。但我的问题是,如果我使用“GET”进行更新操作并编写代码逻辑进行更新,它会在任何情况下产生问题吗?除了标准之外,还有什么可能是为了特定目的而使用这些动词的原因?

我认为这是一个很好的问题。你问的是一个假设:做正确的 other 是否比我们同意使用 GET 进行获取有任何价值?例如:除了 'semantically nice' 之外还有其他价值吗? HTML 中的类似问题可能是:“可以使用 <div>onclick 而不是 <button> 吗?(答案是否定的)。

当然有。客户端、服务器和中间体都根据使用的方法改变它们的行为。即使您的服务器可以处理 GET 更新,并且您构建了一个使用它的客户端,您的浏览器仍然可能会感到困惑。

如果您对此主题感兴趣,请不要在论坛上提问;阅读规范。 HTTP 规范告诉您客户端、服务器和代理在遇到某些方法、状态和 headers.

时应该做什么

开始于 RFC7231

my question if I use "GET" for update operations and write a code logic to update, does it create issues in any scenario?

是的。

一个简单的例子——假设客户端和服务器之间的网络不可靠;具体来说,有一段时间,HTTP 响应正在丢失。通用组件(如 Web 代理)可能会超时,然后注意到请求的方法令牌是 GET,重新发送请求 second/third/fourth 次,您的服务器对每个 GET 请求执行更新。

让我们进一步假设这些多次更新操作会导致不良结果;我们应该在哪里正确地指责?

第二个例子:你给别人发一份link给更新操作,这样他们就可以在合适的时候给你发请求。但是假设您在电子邮件中将 link 发送给他们,并且电子邮件客户端识别 uri 并(作为性能优化)预取 link,从而过早触发您的更新操作。我们应该把责任归咎于哪里?

HTTP does not attempt to require the results of a GET to be safe. What it does is require that the semantics of the operation be safe, and therefore it is a fault of the implementation, not the interface or the user of that interface, if anything happens as a result that causes loss of property -- Fielding, 2002

在这些和其他示例中,blame 正确附加到您的服务器,因为 GET 具有标准化含义,其中包括请求语义为 safe.

的约束

这并不是说在处理 GET 请求时不能有副作用。 “点击计数器”几乎与网络本身一样古老。您在实施中有很大的自由度;只要你尊重统一的接口,就不会有太大的麻烦。


经验报告:我们的一个内部工具使用GET请求来触发调度;在我们精心控制的上下文中(不是网络规模),我们逃脱了它,并且已经持续了很长时间。

借用你的语言,肯定有一些场景会给我们带来问题;但鉴于我们的控制,我们设法避免了它们。

不过,如果请求开始来自我们精心控制的环境之外,我就不希望有机会了。