链接:https://www.zhihu.com/question/28586791/answer/153556269
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
GET
1.GET是通过URL提交数据,因此GET可提交的数据量就跟URL所能达到的最大长度有直接关系。
2.实际上HTTP协议对URL长度是没有限制的;限制URL长度大多数是浏览器或者服务器的配置参数
POST
1.同样的,HTTP协议没有对POST进行任何限制,一般是受服务器配置限制或者内存大小。
2.PHP下可以修改php.conf的postmaxsize来设置POST的大小。
请求header的content-length问题
如果有人恶意伪造content-length很大的包头,但实际上发送content-length很小的请求,这样服务器会一直干等,直到超时。当然服务器是可以通过设置来避免该问题的
GET和POST的安全性
1.GET是通过URL方式请求,可以直接看到,明文传输。
2.POST是通过请求header请求,可以开发者工具或者抓包可以看到,同样也是明文的。 3.GET请求会保存在浏览器历史纪录中,还可能会保存在Web的日志中。
GET和POST对服务器的状态
根据http的设计,大家在看到get的时候,都期望这个请求对服务器没有修改,看到post的时候,都认为这对服务器产生了修改。
GET幂等,POST不幂等
幂等是指同一个请求方法执行多次和仅执行一次的效果完全相同。
1.按照RFC规范,PUT,DELETE和安全方法都是幂等的。虽说是规范,但服务端实现是否幂等是无法确保的。
2.引入幂等主要是为了处理同一个请求重复发送的情况,比如在请求响应前失去连接,如果方法是幂等的,就可以放心地重发一次请求。这也是浏览器在后退/刷新时遇到POST会给用户提示的原因:POST语义不是幂等的,重复请求可能会带来意想不到的后果。
3.比如在微博这个场景里,GET的语义会被用在「看看我的Timeline上最新的20条微博」这样的场景,而POST的语义会被用在「发微博、评论、点赞」这样的场景中。
要说清楚这两个区别,首先要说清楚一个概念——你输入内容的页面和没输入内容的页面是两种东西。
当你进入一个有表单的页面时,假如其URL是"http://www.haha.com",你把这个URL分享给朋友,朋友进入这个页面看到的所有内容将和你看到的一摸一样;
此时你在表单里输入你的名字,没有提交,URL还是“www.haha.com”,此时有两种情况:
1.这个表单的method值是POST。你把这个URL分享给朋友,朋友看到的是和你不一样的页面(页面表单里没有你的名字,除此之外一摸一样)。
2.这个表单的method值是GET。你把这个URL分享给朋友,朋友看到的页面和你的还是不一样(GET能本地缓存(应该没有“联网缓存”)——在某些应用里,关闭网页后再次进入,你会看到一个有你名字的表单。QQ空间网页版就是这样,你在说说处输入内容但不发布,重新打开时你还能看到那个没发布的内容。当然,你清除浏览器的Cookie和网站记录后再次进入这个页面就看不到未发布的内容了)。
现在,你把表单提交了(注意,有时候你可能都不知道自己提交了这个表单,比如百度搜索里,回车就是提交~),有两种情况:
1.表单的method是POST,URL变成了“http://www.haha.com/nimei.php”。此时页面被刷新,你的数据被提交服务器脚本返回给你一个新页面。此时就算你“后退”到“www.haha.com”也看不到你原来输入了内容的那个表单了;你把这个网页分享给朋友,朋友是看不到你的页面的(你这个页面必须是提交相同的数据后才能看到),这也是为什么你登陆微博后,直接复制地址栏的URL发给别人,别人看不到这个网页的原因。
2.表单的method是GET,URL变成了“http://www.haha.com/nimei.php?name="haha"&.....”。此时页面被刷新,同样得到一个新页面。如果你“后退”,你能看到原来输入了内容的表单;你可以保存为书签,关闭后再次打开能看到保存书签时的网页(因为URL里有你发给服务器脚本的所有数据,就相当于再次发送给服务器脚本相同的数据,返回的页面自然也就一样——服务器脚本处理这些数据得到的结果还是一样的话);你可以把这个页面分享给朋友,朋友打开后能看到一摸一样的页面(理由和书签里说的一样)