GET和POST
来源:互联网 发布:网络统考时间 编辑:程序博客网 时间:2024/06/10 01:44
web 开发常见问题--GET POST 区别
HTTP Request Methods
GET、POST 专业名称是 HTTP Request Methods。但 HTTP Request Methods 不只是 GET 和 POST,完整列表如下:
- GET
- POST
- PUT
- DELETE
- HEAD
- OPTIONS
- TRACE
- CONNECT
- PATCH
REST 使用前四个:GET、POST、PUT、DELETE。因些这四个也是经常被一块提及的
可总结如下:
- GET 仅用来获取查看信息,不能改变服务器信息。
- POST 用来改变服务器信息。
这里说的改变,包括增加、修改和删除。
这是 HTTP 协议中的要求,众多浏览器和浏览器插件都遵守这些约定。建议程序员在开发中也能以此为基准。如果你的代码不按照这约定来,可能会出现严重的后果。这里引入一个历史上的小故事说明一下:
“(引入符号)
使用 GET 改变服务器信息的严重后果
假定你编写的 Web 程序或网站允许 GET 提交的修改,比如允许用户通过以下 Url 直接删除编写为 1024 的订单:
~/orders/delete/1024
那么在订单的管理(或列表)页面,你可能会定义一个删除连接如下:
<a href="/orders/delete/1024">删除</a>
当然不会这么简单,一般都会在删除之前会提示用户一下,加上确认提示脚本:
<a href="/orders/delete/1024" onclick="return confirm('确实要删除吗?')">删除</a>
(说明:我在这里只是示简单例下,添加确认删除还是建议使用 Unobtrusive JavaScript 方式,可以使用 jQuery。)
很多开发人员以为这样就万事大吉了,有了确认提示,也不怕误删。但问题就恰恰出在这里,2005年时,谷歌发布了一款浏览器加速插件:Google Web Accelerator(以下简称 GWA),让这种问题严重的暴露了出来。
GWA 通过多种技术来加速,其中一种就是页面预先加载:比如你在查看我这篇文章的时候,GWA 可能把我前一篇或其它文章预先在后台下载,这样你在点击时,就节省了时间,起到了加速的效果。
GWA 的预先加载是根据当前页面中的链接来的,根据 HTTP 的协议,点击链接时使用 GET 方法获取信息,因些不会对服务器造成影响。因此 GWA 会放心的加载当前页面链接对应的网页。当然也可能会加速上面提到的订单删除链接,GWA 会无视你的确认删除脚本,直接从后台把 "/orders/delete/1024" 载入,也就意味着 1024 订单已经被删除了。
GWA 发布后,很多网站出现了很多莫名其妙的问题,数据无故丢失,商品自动加入了用户的购物车,用户无端地被扣款…
一时问题很严重,后来发现的原因的所在,就是网站开发者没有遵守 HTTP 约定,没有弄明白 GET 和 POST 的区别。
可以查看以下文章深入了解这段历史:
http://blogs.adobe.com/cantrell/archives/2005/06/what_have_we_le.html
http://blog.moertel.com/articles/2005/05/06/google-web-accelerator-offers-web-developers-an-important-opportunity
而如今,谷歌发布的 Chrome 浏览器,类似的加速功能集成了进去,你可以在 设置 - 显示高级设置 里面看得到:
所以,对服务器有改变的一定要用 POST,GWA 和类似的插件不会提交 POST 表单加速的。
删除、查看用户信息收费(比如人才网、婚恋网)、加入购物车等操作还是放在 POST 表单中用 Button 来吧。
再回头读维基百科中对 Safe Methods 的说明,相信你会明白很多。
注意:但也不是所有对服务器有改变的都要用 POST,比如你点击本文下面的 前一篇博文链接 ,我的文章访问量可能+1,对服务器有所改变,但这种改变是轻微的,影响不大(相对删除、扣款来说),可以放心的使用链接(GET 方式)。
“
以上是HTTP协议对于GET POST却别的定义,而在开发中,即HTML中,我们还可以简单的理解为:
1. GET使用URL(或Cookie传参)。而POST将数据放在BODY中。
2. GET的URL会有长度上的限制,限制主要在于URL的长度的限制,则POST的数据则可以非常大。
3. POST比GET安全,数据在地址栏上不可见。参数不会被保存在浏览器历史或 web 服务器日志中
4.对数据类型的限制,get 只允许 ASCII 字符,post没有限制。也允许二进制数据
5.get 后退按钮/刷新无害,而post 数据会被重新提交(浏览器应该告知用户数据会被重新提交)。- Post和Get的
- post和get传值
- GET和POST
- GET和POST
- get 和 post
- 区分get和post
- GET 和 POST 区别
- 关于GET和POST
- get 和 post
- Get和Post区别
- get和post区别
- get和post
- GET和POST区别
- Get 和 post区别
- get和post
- get和post区别
- POST和GET区别
- C# Get和Post
- 获取输入法候选调研
- spark 评估指标
- Educational Codeforces Round 14 题解
- locate 命令
- 基于TQ2440的小车编写(初步)
- GET和POST
- 单调队列1006 POJ 1821 Fence
- TreeSet重写比较器按照字符串长度排序
- 在ubuntu中用vscode编译调试C\C++
- 各个平台支持的Cocos2d-x最大纹理尺寸
- 单调队列1007 Codeforces Round #219 (Div. 1) 372C. Watching Fireworks is Fun
- Android 微博分享及其注意事项
- 关于PowerImageView使用问题总结
- javascript