在浏览MVC概念时,我已经读到在“GET”操作中包含代码来改变服务器对象状态(数据库更新等)并不是一个好习惯。 “缓存返回数据”已被作为理由。
有人可以解释一下吗?
提前致谢!
答案 0 :(得分:6)
这是HTTP标准。 GET动词应该是幂等和安全的。
9.1.1安全方法
实施者应该知道该软件代表用户 他们在互联网上的互动,应该小心允许 用户要知道他们可能采取的任何行动 对自己或他人意想不到的重要性。
特别是,已经建立了GET和GET的惯例 HEAD方法不应该具有采取行动的意义 除了检索。这些方法应该被认为是“安全的”。 这允许用户代理表示其他方法,例如POST,PUT 和DELETE,以一种特殊的方式,使用户了解 事实上,正在要求采取可能不安全的行动。
当然,无法确保服务器不能 由于执行GET请求而产生副作用;在 事实上,一些动态资源考虑了一个功能。重要的 区别在于用户没有请求副作用,所以 因此不能对他们负责。
答案 1 :(得分:5)
浏览器可以缓存GET请求,通常是静态数据,如图像或脚本。但是您也可以允许浏览器使用[OutputCache]
或其他类似方式将GET请求缓存到控制器操作,因此如果为GET控制器操作启用了缓存,则可能会单击指向{{的链接1}}实际上并不在服务器上运行/Home/Index
方法,而是允许浏览器从自己的缓存中提供页面。
通过这种思路,您可以安全地启用GET操作上的缓存,其中您提供的数据不会更改(或不会经常更改),并且知道您的服务器操作不会每次都开火。
浏览器不会缓存POST,因此保证任何POST都可以进入服务器。
答案 2 :(得分:2)
暂时忽略缓存。另一种思考方式是搜索引擎在索引/抓取过程中会存储 HTTP GET 链接,因此它们会显示在搜索结果中。
假设您的 /主页/索引是以 GET 实现的,但是每次此链接显示在搜索引擎上时,就可以说删除数据库中的一行有人点击它,你会有一个删除行,很快就会删除很多行。
答案 3 :(得分:1)
HTTP规范声明GET和HEAD应该是幂等的,即。他们不应该改变服务器状态。
这方面的一个实际方面是,搜索机器人会针对他们所知道的任何链接发出GET。如果这样的GET更改用户数据并不意味着更改,那么您就遇到了麻烦。
具有幂等性还有一个额外的好处,即客户端可以缓存GET的结果(使用HTTP头来控制它)。