GET与POST这真的很重要吗?

时间:2009-07-08 20:27:01

标签: asp.net http

好的,我知道目的不同。 GET是获取一些数据。提出请求并获取数据。 POST应该用于CRUD操作,而不是我认为的读取。但是当它归结为它时,服务器是否真的关心它最终是否接收到GET与POST?

20 个答案:

答案 0 :(得分:15)

根据HTTP RFC,GET不应该有任何副作用,而POST可能有副作用。

最基本的例子是,GET不适用于购买交易或将文章发布到博客等任何内容,而POST适用于具有后果的操作。

通过RFC,您可以让用户负责POST(例如购买)所做的操作,但不能用于GET操作。 '因此,机器人总是使用GET。

来自RFC 2616, 9.1.1

  

9.1.1安全方法

     

执行者应该意识到这一点   软件代表用户   他们在互联网上的互动,   并且应该小心允许   用户要了解他们的任何行动   可能需要哪个可能有   对自己意外的意义   或其他人。

     

特别是,大会有   已经建立了GET和   HEAD方法应该没有   采取行动的重要性   除了检索。这些方法   应该被认为是“安全的”。这个   允许用户代理代表其他代理   方法,如POST,PUT和   以特殊方式删除,以便   用户意识到这一事实   可能不安全的行动正在发生   请求。

     

当然,这是不可能的   确保服务器没有   产生副作用的结果   执行GET请求;事实上,   一些动态资源考虑到了   特征。重要的区别   这是用户没有请求   副作用,因此   不能对他们负责。

答案 1 :(得分:12)

如果搜索引擎正在抓取页面,那么它会发出GET请求而不是POST。假设您的页面上有链接:

http://www.example.com/items.aspx?id=5&mode=delete

如果在删除之前未执行某种授权检查,Googlebot可能会从您的网页come in and delete items开始。

答案 2 :(得分:9)

既然您是编写服务器软件的人(大概是),那么它会关心您是否关心它。如果你以相同的方式处理POST和GET数据,那么不,它没有。

然而,浏览器绝对关心。例如,刷新或单击回到您作为对POST的响应而获得的页面会弹出“您确定要再次提交数据”提示。

答案 3 :(得分:4)

GET具有基于发送浏览器的数据限制限制:

URL长度的规范并未规定最小或最大URL长度,但实现因浏览器而异。在Windows上:Opera支持~4050个字符,IE 4.0+支持2083个字符,Netscape 3 - > 4.78在关闭错误之前支持最多8192个字符,Netscape 6在启动错误之前支持~2000

答案 4 :(得分:2)

如果您使用GET请求来更改后端状态,那么如果某种类型的网络抓取工具遍历您的网站,您就会面临发生不良事件的风险。当wiki首次流行时,有一些恐怖故事被删除,因为“删除页面”功能是作为GET请求实现的,当Googlebot敲响时会带来灾难性的结果......

答案 5 :(得分:2)

“使用GET if:交互更像是一个问题(即,它是一个安全的操作,如查询,读取操作或查找)。”

“如果以下情况使用POST:交互更像是订单,或者交互以用户会感知的方式更改资源的状态(例如,订阅服务),或者用户要对互动的结果。“

source

答案 6 :(得分:2)

根据HTTP规范,GET是安全且幂等的,而POST则不是。这意味着GET请求可以重复多次而不会产生副作用。

即使您的服务器不关心(并且这不太可能),您的客户端和服务器之间可能存在中间代理,所有这些代理都有这种期望。例如,在ISP或其他提供商处缓存数据的代理,以提高性能。对于加速器也是如此,例如,浏览器的预取插件。

因此可以缓存GET请求(基于某些参数),如果失败,可以自动重复,而不会有任何有害影响。所以,你的服务器真的应该努力履行这份合同。

另一方面,POST不安全,不是幂等的,并且每个代理都知道不缓存POST请求的结果,或者自动重试POST请求。因此,例如,信用卡交易永远不会是GET请求(您不希望帐户因网络错误而多次扣款)。

这是一个非常基本的看法。有关更多信息,您可以考虑Ruby和Richardson撰写的“RESTful Web Services”一书(O'Reilly出版社)。

要快速了解REST主题,请考虑以下帖子:

http://www.25hoursaday.com/weblog/2008/08/17/ExplainingRESTToDamienKatz.aspx

有趣的是,大多数人都在争论PUT诉POST的优点。 GET和POST问题一直很好地解决了。忽略它是你自己的危险。

答案 7 :(得分:1)

GET在浏览器方面有局限性。例如,some browsers限制了GET请求的长度。

答案 8 :(得分:1)

我认为更合适的答案是,你可以用两者做同样的事情。然而,这不是一个偏好问题,而是正确使用的问题。我建议您使用GET和POST来使用预期

答案 9 :(得分:1)

您要注意一些微妙的安全差异。看我的问题

  

GET versus POST in terms of security?

基本上要记住的重要事项是GET将进入浏览器历史记录并将通过代理以纯文本形式传输,因此您不需要任何敏感信息,例如GET中的密码。

明显可能,但值得一提。

答案 10 :(得分:1)

用户是否应该能够为生成的页面添加书签?另一件需要考虑的事情是某些浏览器/服务器错误地限制了GET URI长度。

修改:更正了字符长度限制备注 - 感谢ars!

答案 11 :(得分:0)

由于GET旨在指定您想要的资源,根据服务器端的确切软件,Web服务器(或其前面的负载均衡器)可能对GET请求有大小限制以防止拒绝服务攻击...

答案 12 :(得分:0)

这确实很重要。我聚集了大约11种您应该知道的与它们相邻的东西。

11 things you should know about GET vs POST

答案 13 :(得分:0)

从技术上讲,没有。所有GET都会在HTTP请求的第一行发布内容,而POST会将内容发布到正文中。

然而,“网络基础设施”如何处理这些差异会让世界变得与众不同。我们可以写一本关于它的书。但是,我会给你一些“最佳实践”:

当您的HTTP请求改变Web服务器内部“具体”的内容时,请使用“POST”。即,您正在编辑页面,创建新记录,等等。 POSTS不太可能被缓存,或被视为“可重复而没有副作用”的东西

当您想要“查看对象”时,请使用“GET”。现在,这样的外观可能会在缓存或记录保存方面改变“幕后”,但它不应该改变任何“实质性”的东西。也就是说,我可以一遍又一遍地重复我的GET,除了夸大的命中数之外,什么都不会发生。 GET应该很容易收藏,因此用户以后可以回到同一个对象。

GET的参数(传统上的?之后的东西)应该被视为“视图属性”或“查看内容”等等。同样,它实际上不应该改变任何东西:使用POST。

最后一句话,当您发布某些内容(例如,您正在创建新评论)时,请对帖子进行处理,以便将用户“重定向”到查看该对象的新URL。即,POST处理信息,然后将浏览器重定向到GET语句以查看新状态。由于POST而显示信息也可能导致问题。经常使用重定向,并使事情更好。

答案 14 :(得分:0)

是的,这很重要。 GET和POST真的很不一样。

你是对的,通常,GET用于从服务器“获取”数据并显示页面,而POST用于将数据“发布”回服务器。在内部,您的脚本获取相同的数据,无论是GET还是POST,所以不,服务器并不真正关心。

主要区别在于GET参数在URL中指定,而POST则不在。这就是POST用于注册和登录表单的原因 - 您不希望在URL中使用密码。同样,如果您正在查看不同的页面或显示某些数据的特定视图,通常需要一个唯一的URL。

答案 15 :(得分:0)

请注意,浏览器可能会缓存GET请求,但通常不会缓存POST请求。

答案 16 :(得分:0)

服务器通常不关心。但正如你所提到的,它主要是为了遵循良好做法。客户端也很重要 - 如前所述,您通常无法为POST页面添加书签,并且某些浏览器对于长时间GET查询的URL长度有限制。

答案 17 :(得分:0)

服务器在技术上无论如何都不关心它收到的请求类型。它将盲目地执行任何来自网络的请求。

问题是什么。如果您的某项操作会在GET操作中销毁或修改数据,那么Google会在浏览索引时撕毁您的网站。

答案 18 :(得分:0)

这取决于服务器端的软件。有些库,比如perl中的CGI.pm,默认情况下处理这两个库。但是在某些情况下,您或多或少必须使用POST而不是GET,至少是为了将数据推送到服务器。大量数据(相应的GET url会变得太长),二进制数据(避免大量编码/解码问题),多部分文件,非解析标题(用于AJAX之前的连续更新......)和类似

答案 19 :(得分:-1)

不,他们不应该除了@ jbruce2112的答案和上传文件需要POST。