首页 > 代码库 > POST or GET?
POST or GET?
在web2.0时代,很多网站不再是枯燥的静态页面,也不是那种加上让用户填写一些表单的简单页面。它们已经功能复杂的应用程序。本文,着重改善这些web应用程序出现的问题中的get和post。针对不同需求的问题,我们一起探讨一下关于post和get的话题。
Post
get访问的URL可以是而且应该是爬虫抓取、预抓取、缓存、重用和其他自动访问上。而不安全操作,如确定订购、下订单、达成协议和删除页面等,应该通过post执行,避免没有显式用户请求和同一的情况下发生意外的操作。例如搜索引擎删除整个页面,只因为抓取了一个链接。很多不希望用户浏览器遵循页面链接的各种完整,这些情况下,应该要求用户登录并且足够的权限才能执行某些危险操作。
因此,如果发现不安全操作由链接触发,用表单替换它,使用隐藏字段设置查询字符串变量。
< a href = http://www.mamicode.com/“/admin.php?action=approve&id=1798”>Approve>
它有两个字段:值为approve的action和值为1798的id。查询字符串中的每个字段可以转换为下面表单中相应的隐藏字段。链接的文本则变成提交按钮的文本。
<form method =”post” action = “/admin.php”> <input type =”hidden” name =”action ” value =”approve” /> <input type =”hidden” name =”id ” value =”approve” /> <input type =”submit” id=”approve ” value =”Approve” /></form>
然后样式化按钮,让他看起来更像一个链接
input#approve{ border : none; background :white; color :blue; text-decoration :none;}
给购物车添加商品,很多网站喜欢用post,只是因为不愿意让浏览器自动化这个过程。实现预览的功能用get还是post可能取决于实现细节和惯例。浏览器预抓取或是直接连接预览都是没有问题的,但如果预览在某种意义上会创造评论资源,但不希望让其他用户看到,使用post更适合。
Get
然而,get形式的url对搜索引擎更加友好,可以提高搜索引擎排名。Post使用的url有时候会阻止爬虫和搜索引擎的访问。其他网站和用户可以链接到get形式的url,无论用户的访问,还是搜索引擎的收录而相应提高了页面排名,能够直接或间接提高网站浏览。
同时,get形式的url这种表示法是可以缓存的,显著提升了客户端和服务端的性能。
部分防火墙和代理服务器的配置是只允许get请求,而封禁post请求。HTTP本身就允许网络管理员控制网络传输,并区分安全与潜在的危险请求,采用post而非get会阻止一些在安全级别比较高的环境下的人访问你的网站。
以下操作都应该通过post操作(只是范例,日常将继续更新)
订购商品
签署法律文档
提交博客评论
从CMS中删除页面
签署申述
发送电子邮件
向数据库插入新内容
相比之下,一下的操作应该通过get操作,因为这是安全的,而且不必强制用户接受。
读取一份法律文档
从CMS下载一份可编辑文档的副本
读取电子右键
查看地图
检测机器的当前状态
有些操作两者都可以使用,比如:
给购物车添加商品(非马上交易)
预览博客的评论
总之,GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。
若符合下列任一情况,则用POST方法:
* 请求的结果有持续性的副作用,例如,数据库内添加新的数据行。
* 若使用GET方法,则表单上收集的数据可能让URL过长。
* 要传送的数据不是采用7位的ASCII编码。
若符合下列任一情况,则用GET方法:
* 请求是为了查找资源,HTML表单数据仅用来帮助搜索。
* 请求结果无持续性的副作用。
* 收集的数据及HTML表单内的输入字段名称的总长不超过1024个字符。
POST or GET?