我正在开发REST WCF服务,理论上我知道何时选择什么目的。 GET用于获取资源 PUT用于更新 POST用于插入 DELETE用于删除 但是如果我们不遵循上述规则,例如用GET方法插入记录,会有什么缺点呢?
由于HTTP GET方法被指定为幂等的,因此按规范进行的GET请求可以再次提交而不会更改服务器上的任何内容。但是,按规范进行的HTTP POST请求可能会更改运行在服务器上的应用程序的状态,这不适用于HTTP GET请求。因此,按规范进行的HTTP GET请求可以多次针对某个页面执行,而无需担心更改其状态。不遵守规范可能会产生各种不良后果。例如,Web爬虫会跟随GET请求索引站点,但不会跟随POST请求。如果允许HTTP GET请求更改数据库中的数据,则可以轻松理解它所带来的不良影响。遵守规范就像尊重您的服务或网站与各种消费者之间的协议一样,这些消费者可以是普通用户的浏览器,也可以是像Web爬虫这样的其他服务。您可以构建一个使用GET请求插入记录的站点,但是您还应该期望围绕站点构建的任何内容都基于您遵守协议的假设而运作。最后一个例子是,当用户尝试刷新由HTTP POST请求到达的页面时,Web浏览器会发出警告,警告可能会重新提交某些数据。如果页面是通过HTTP GET请求到达的,则在浏览器中没有内置的此类保护层。您可以在此处阅读更多信息:http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html
但是,如果我们不遵循这个规则并使用GET 方法插入记录,会有什么缺点呢?搜索引擎使用GET请求访问你的页面,因此如果你使用GET方法插入记录,Google的爬虫可能会插入你不想要的记录。通常情况下,人们会在任何一种ajax请求中使用POST方法,并将实际动作放在请求的主体中。这样做没有太大的问题,但该功能是供你使用的,所以你最好使用它。
我曾面临过这样的情况,我本应该使用PUT而不是GET。我进行了一个权限插入调用,向第三方(Google)发送请求。我发起了一个Ajax GET请求,将更新权限的调用发送到我的Servlet,然后调用去了外部服务。外部服务花费了相当长的时间来完成请求。在此期间,我在我的服务器日志中看到了同一权限调用的重复。由于这是一个GET请求,浏览器可以无限次地调用服务器,所以它一直在调用服务器问是否已经完成。浏览器遵循标准,但我的代码没有遵循标准。我没有按照标准来解决这个问题。