为什么在RESTful调用中使用HTTP GET更新服务器上的状态不正确?

atc*_*way 9 rest post get http restful-architecture

好了,我已经知道所有的原因在纸上,为什么我应该不是做一个REST调用来更新服务器上的东西的状态时使用HTTP GET.因此每次可能返回不同的数据.而且我知道以下"纸上"原因是错误的:

  • HTTP GET调用应该是幂等的
  • N> 0个调用应始终返回相同的数据
  • 违反HTTP规范
  • HTTP GET调用通常是只读的

我相信还有更多理由.但是我需要一个具体的简单示例来证明"嗯,这违反了HTTP规范!".......或者至少我希望有一个.我还已经阅读了以下列表中的以下内容:当我在GET调用中向服务器写入内容时,它是否违反了RESTful?& HTTP POST与URL查询参数 - 好主意与否?

例如,有人可以证明以上内容以及为什么使用HTTP GET说错误/不良做法/不正确,请使用以下RESTful调用

"MyRESTService/GetCurrentRecords?UpdateRecordID=5&AddToTotalAmount=10"
Run Code Online (Sandbox Code Playgroud)

我知道这是错的,但希望它有助于提供一个例子来回答我原来的问题.因此,上面将使用AddToTotalAmount = 10更新recordID = 5,然后返回更新的记录.我知道应该使用POST ,但是假设我确实使用了GET.

如何确切地回答我的问题是否会导致实际问题?除了上述项目符号列表中的所有违规行为外,如何使用HTTP GET执行上述操作会导致一些实际问题?太多次,我进入一个场景,我可以用"因为医生这么说"来证明事情,但我需要理由并更好地理解这一点.

谢谢!

Fra*_* IV 17

您遇到问题的实际情况是HTTP GET经常在HTTP实现失败的情况下重试.因此,您可以在现实生活中获得服务器多次接收相同GET的情况.如果你的更新是幂等的(你的更新),那么就没有问题了,但如果它不是幂等的(比如在某个数量上添加一些值),那么你可能会得到多个(不需要的)更新.

永远不会重试HTTP POST,因此您永远不会遇到此问题.

  • 这取决于HTTP客户端实现.我编写了Oakland Software实现并自动重试.我认为Sun Java one和Apache HTTPClient也可以.这不是开发人员所担心的. (2认同)

Dar*_*ler 5

如果某种形式的搜索引擎搜寻您的网站,则可能会无意间更改您的数据。

过去,这种情况发生在Google的桌面搜索中,导致人们丢失数据,因为人们已经将删除操作实现为GET。