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

16 浏览
0 Comments

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

好的,我已经完全了解了使用HTTP GET进行RESTful调用以更新服务器上某个内容的状态时,为什么纸上的理由都是不应该这样做的。这样可能每次返回的数据都不同。我知道这样做是错误的,理由如下:\n

    \n

  • HTTP GET调用应该是幂等的
  • \n

  • 每次N > 0的调用都应该返回相同的数据
  • \n

  • 违反了HTTP规范
  • \n

  • HTTP GET调用通常是只读的
  • \n

\n我确信还有更多的理由。但我需要一个具体简单的例子来证明,而不仅仅是“这违反了HTTP规范!”...或者至少我希望有一个。我已经阅读了以下更接近上述列表的内容:Does it violate the RESTful when I write stuff to the server on a GET call? 和\nHTTP POST with URL query parameters -- good idea or not?\n例如,有人能够为上述问题提供理由,解释为什么使用HTTP GET进行以下RESTful调用是错误的/不良实践/不正确的吗?\n

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

\n我知道这是错误的,但希望它能提供一个例子来回答我的最初问题。所以上述代码将使用AddToTotalAmount = 10更新recordID = 5,然后返回更新后的记录。我知道应该使用POST,但假设我确实使用了GET。\n除了以上项目列表中的所有违规行为外,使用HTTP GET来执行上述操作可能会引起什么实际问题?太多次我遇到这样的情况,我能够用“因为文档这么说”来证明一些事情,但我需要正当理由和对这个问题的更好理解。\n谢谢!

0
0 Comments

使用HTTP GET请求在RESTful调用中更新服务器状态是不正确的,这是由于跨站请求伪造(Cross Site Request Forgery Attacks)攻击的重要原因之一。根据书中的描述:《Professional ASP.NET MVC 3》

“幂等的GET请求”是一个重要的概念,如果一个操作是幂等的,那么它可以被多次执行而不改变结果。一般来说,一个很好的经验法则是,通过使用POST方法来更改数据库或站点中的内容,可以防止一整类CSRF攻击。这意味着注册、注销、登录等操作只能使用POST方法。至少,这在一定程度上限制了混淆代理攻击。

解决这个问题的方法是使用POST方法来更新服务器状态,而不是使用GET方法。这样可以防止CSRF攻击,并提高系统的安全性。

以下是一段示例代码,展示了如何使用POST方法来更新服务器状态:

在这个示例中,我们使用一个表单来发送POST请求,将要更新的状态作为一个隐藏字段传递给服务器。通过这种方式,我们可以确保只有经过身份验证的用户才能执行该操作,并且可以防止CSRF攻击。

总结起来,使用HTTP GET请求来更新服务器状态是不正确的,因为这会增加系统遭受CSRF攻击的风险。解决这个问题的方法是使用POST方法来更新服务器状态,并采取适当的安全措施来防止CSRF攻击。

0
0 Comments

使用HTTP GET方法来更新服务器上的状态在RESTful调用中是不正确的,原因在于如果某种形式的搜索引擎爬取您的网站,它可能会意外地更改您的数据。这在过去曾经发生过,例如谷歌桌面搜索就导致人们丢失数据,因为一些人将删除操作实现为GET请求。

为了解决这个问题,应该使用HTTP POST方法来更新服务器上的状态。通过使用POST方法,可以确保更新操作不会被搜索引擎等爬虫意外地执行。以下是使用HTTP POST方法来更新服务器状态的示例代码:

POST /api/data/123 HTTP/1.1

Host: example.com

Content-Type: application/json

{

"name": "John",

"age": 30

}

在上面的示例中,我们使用POST方法将新的数据发送到服务器的特定API端点(/api/data/123)。通过将数据包含在请求正文中,并设置适当的内容类型标头(Content-Type),可以确保数据以结构化的方式传递给服务器。

总之,为了避免意外更改数据,应该使用HTTP POST方法而不是HTTP GET方法来更新服务器上的状态。这样可以确保只有经过授权的请求才能执行更新操作,而不会受到搜索引擎等爬虫的干扰。

0
0 Comments

使用HTTP GET请求在RESTful调用中更新服务器状态是不正确的,主要原因是HTTP GET请求在发生失败时通常会被HTTP实现重试。因此,在实际生活中,服务器可能会收到多个相同的GET请求。如果您的更新是幂等的(像您的这个例子),那就没有问题,但如果它不是幂等的(例如,向某个值添加一些值),那么您可能会得到多个(不希望的)更新。

解决方法是使用HTTP POST请求,因为它从不重试。这样就不会出现上述的问题。

是的,正确 - 我试图进行的是一个不是幂等的调用,但我想我还是得到了一个幂等的结果。我刚刚更新了我的示例,添加了“AddToTotalAmount=10”,以使调用不再是幂等的。

你能看到的主要陷阱只有重试GET调用吗?这个陷阱足够重要,但我想知道是否还有其他原因。

是的,据我所知,这确实是唯一的原因。如果你看一下HTTP实现,这确实是GET和其他HTTP请求之间的唯一区别。

最后一个问题 - GET请求在失败时是否会自动重试(像内置功能一样),还是你只是说在实践中开发人员通常会进行编程式的重试?

这取决于HTTP客户端的实现。我编写了Oakland Software的实现,它会自动重试。我认为Sun Java和Apache HTTPClient也会。这不是开发人员需要担心的事情。

0