9

好的,我已经知道为什么在进行 RESTful 调用以更新服务器上某些内容的状态时不应该使用 HTTP GET 的所有原因。因此每次返回可能不同的数据。而且我知道这是错误的,原因如下:

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

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

例如,有人可以通过以下 RESTful 调用来证明上述内容以及为什么使用 HTTP GET 是错误的/不好的做法/不正确的

"MyRESTService/GetCurrentRecords?UpdateRecordID=5&AddToTotalAmount=10"

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

如何准确地回答我的问题,或者这会导致实际问题吗?除了上述项目符号列表中的所有违规行为之外,使用 HTTP GET 执行上述操作如何导致一些实际问题?太多次我遇到这样一种情况,我可以用“因为医生这么说”来证明事情的合理性,但我需要证明和更好地理解这一点。

谢谢!

4

5 回答 5

19

您会遇到问题的实际情况是,在 HTTP 实现失败的情况下,通常会重试 HTTP GET。因此,您可以在现实生活中遇到服务器多次接收相同 GET 的情况。如果您的更新是幂等的(您的更新是幂等的),那么就不会有问题,但如果它不是幂等的(例如为金额添加一些值),那么您可能会获得多个(不希望的)更新。

HTTP POST 永远不会重试,所以你永远不会遇到这个问题。

于 2012-05-09T15:28:04.893 回答
5

如果某种形式的搜索引擎蜘蛛您的网站,它可能会无意中更改您的数据。

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

于 2012-05-09T15:48:02.600 回答
1

这是一个重要原因,即 GET 应该是幂等的,而不是用于在跨站点请求伪造攻击方面更新服务器上的状态。出自本书:专业的 ASP.NET MVC 3

幂等 GET
肯定是个大词——但这是一个简单的概念。如果一个操作是幂等的,它可以被执行多次而不改变结果。一般来说,一个好的经验法则是,您可以通过使用 POST 仅更改数据库或站点中的内容来防止一整类 CSRF 攻击。这意味着注册、注销、登录等。至少,这在一定程度上限制了迷惑副手的攻击。

于 2012-05-11T19:42:07.450 回答
0

还有一个问题。如果使用 GET 方法,数据将在 URL 本身中发送。在 Web 服务器的日志中,这些数据与请求路径一起保存在服务器的某处。现在假设如果有人可以访问/读取这些日志文件,您的数据(可以是用户 ID、密码、关键字、令牌等)就会被泄露。这是危险的,必须加以注意。

在服务器的日志文件中,不记录标头和正文,但请求路径为 . 因此,在 POST 方法中,数据在正文中发送,而不是在请求路径中,您的数据仍然是安全的。

于 2020-07-25T13:55:00.530 回答
-2

i think that reading this resource: http://www.servicedesignpatterns.com/WebServiceAPIStyles could be helpful to you to make difference between message API and resource api ?

于 2012-05-09T15:33:22.373 回答