玩转GET 和 POST

HTTP 基本概念

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。因些这四个也是经常被一块提及的,将这四个作为关键字进行搜索,你会得到更深入的结果。

在一般的 Web 开发中,GET 和 POST 用得最多。

Safe Methods(安全方法)

RFC 2616 中定义如下(后面有翻译):

Implementors should be aware that the software represents the user in their interactions over the Internet, and should be careful to allow the user to be aware of any actions they might take which may have an unexpected significance to themselves or others.

In particular, the convention has been established that the GET and HEAD methods SHOULD NOT have the significance of taking an action other than retrieval. These methods ought to be considered "safe". This allows user agents to represent other methods, such as POST, PUT and DELETE, in a special way, so that the user is made aware of the fact that a possibly unsafe action is being requested.

Naturally, it is not possible to ensure that the server does not generate side-effects as a result of performing a GET request; in fact, some dynamic resources consider that a feature. The important distinction here is that the user did not request the side-effects, so therefore cannot be held accountable for them.

网址:http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.1.1

维基百科中的说明(对 RFC 2616翻译):

开发者应当意识到他们的软件代表了用户在因特网上进行交互,并且应当告知用户,他们正在进行的操作可能对他们自身或者其他人有未曾预料的重要影响。

特别地,对于GET和HEAD方法而言,除了进行获取资源信息外,这些请求不应当再有任何其他意义。也就是说,这些方法应当被认为是“安全的”。客户端应当使用其他“非安全”方法,例如POST,PUT及DELETE来以特殊的方式(通常是按钮而不是超链接)使得客户能够意识到可能要负的责任(例如一个按钮带来的资金交易)或者被告知正在请求的操作可能是不安全的(例如某个文件将被上传或删除)。

但是,不能想当然地认为服务器在处理某个GET请求时不会产生任何副作用。事实上,很多动态资源会把这作为其特性。这里重要的区别在于用户并没有请求这一副作用,因此不应由用户为这些副作用承担责任。

拓扑图

GET 与 POST 的区别

综上所述,可总结如下:

  • 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 的区别。

而如今,谷歌发布的 Chrome 浏览器,类似的加速功能集成了进去,你可以在 设置 - 显示高级设置 里面看得到:

所以,对服务器有改变的一定要用 POST,GWA 和类似的插件不会提交 POST 表单加速的。

删除、查看用户信息收费(比如人才网、婚恋网)、加入购物车等操作还是放在 POST 表单中用 Button 来吧。

再回头读维基百科中对 Safe Methods 的说明,相信你会明白很多。

注意:但也不是所有对服务器有改变的都要用 POST,比如你点击本文下面的 前一篇博文链接 ,我的文章访问量可能+1,对服务器有所改变,但这种改变是轻微的,影响不大(相对删除、扣款来说),可以放心的使用链接(GET 方式)。

基它一些区别:

  • 使用 GET 表单查询,查询结果页面可以收藏;POST 表单不行。
  • 向服务器发送文件只能使用 POST 表单。

能想到的大致这些吧。

感言

之前,我曾学习 ASP.NET 多年,但对 HTTP 几乎一无所知,WebForm 封装了一切:

  • 不用去考虑 POST、GET,只需知道 Postback;
  • 不用多考虑值来回传递,因为有 ViewState;
  • 不用关心 Html,因为有服务端控件。

更悲哀的是,我有很长一段时间都认为一个页面上只能有一个 Form。

后来做了一段时间 WinForm 后,开始学习 ASP.NET MVC,开始逐步了解 Html、Http 等等,也开始知道了 Post-Redirect-Get 模式等等。

看到很多人浅浅讨论 GET 和 POST,感到很无奈,WebForm 误人啊。要想进步,还是学学 ASP.NET MVC 吧!

玩转GET 和 POST,布布扣,bubuko.com

时间: 2024-09-28 04:38:33

玩转GET 和 POST的相关文章

【精品】北京赛车计划冠军定位玩法技巧

車車是一種投資,我們的目標是:細水長流,見好就收,不求日金千金,只求長期穩定!許多人賠本的原因:1. 資金不足,卻大把下注,跟到第4期不出,錢不夠了,心慌了.有人孤注一擲,衝到第5期中了,嚇的半死.有人不敢跟,第5期出號了,氣死, 然後再跟新計劃,沒錢了,郁悶死.這兩種做法都不對,既然是以投資的心態做事,就應該計劃好翻倍的本錢,做到99%的穩賺,狀況不對就要及時止損. 看著連續中,就是不敢跟,最後咬牙跟了,馬上挂了.于是開始哭,我運氣咋這麽差.不買就中,一買就挂.相反,有些人專門等挂,一挂就上,

java用循环方式实现和计算机玩猜拳的程序

用循环方式实现和计算机玩猜拳的程序 (设定胜出条件--输3次或赢3次即退出) /*int a=0;//统计赢得次数 int b=0;//统计输的次数 for(;;){ System.out.println("请输入1.石头:2.剪刀:3.布"); int user=sc.nextInt();//声明用户输入 int cp=(int)(Math.random()*3+1);//声明电脑随机 switch(user){ case 1: System.out.println("用户

几个linux终端的有趣玩法

1.sl 还可以给别人搞恶作剧: alias ls=sl 这样别人使用 ls 列出目录和文件的时候,却出现一个小火车,那滋味一定很酸爽哈哈哈哈! 2. fortune 这个命令会随机输出有趣的话,比如名言或笑话.同样需要先安装. apt-get install fortune (for aptitude based system) yum install fortune (for yum based system) [email protected]:~$ fortune There is no

MAC安裝《Genymotion Android模擬器》大玩Android APP (神魔之塔)

链接地址:http://www.minwt.com/mac/10083.html/comment-page-2 MAC» 智慧型裝罝» Android | 2014/02/12 Android是一個開放的平台,因此先前也分享了幾個Android的模擬器,但當初梅干使用Android模擬器,最主要的功能就是用來測試網頁,看網頁在Android手機上是否能正常運作,雖然說這些Android模擬器,也可透過Google Player安裝Android APP,在電腦中就可玩Android APP,但由

企业怎样玩转10亿网民?田溯宁有不一样的想法!

京东商城创始人刘强东在中美互联网论坛上表示,中国是世界上最大的互联网市场,未来十年中国网民将超10亿.阿里巴巴创始人马云谈到当前中国传统企业经营压力增大,但更应该看到新经济增长的势头不亚于美国,中国市场潜力巨大.联想CEO杨元庆则提到,现在是一个资源全球配置的时代. 面对一个拥有全球最大网民规模.员工数量动辄上万的企业规模.全球化资源配置以及新经济增长模式层出不穷的转型时代,传统企业究竟要如何实现互联网+.如何玩转即将出现的10亿网民所带来的数据红利和网民人口红利?被誉为中国"互联网建筑师&qu

QQ群排名自动吸粉,同样是玩群,为什么他们这么牛?

说到玩QQ群,我们相信每个人都会有不同的感想,那同样是玩QQ群,为什么有的人一毛钱都没捞到,有的人却可以赚得盆满钵满,其实,玩QQ群和做项目一样,其本身并无好坏,只不过是看谁来玩罢了,下面我们就举几个简单的例子来说明一下: 案例1.用QQ群玩人脉的"人脉哥" 我们和人脉哥是好朋友,他算得上是一个玩QQ群的高手,他的高明之处不在于玩QQ群的技术上,而是在于QQ群运用上; 人脉哥本身是做小儿推拿的,所以他就建了几个本地的母婴群,他建群的目的不是为了吸引那些新妈妈们入群,然后直接推销自己的产

B - 瑶瑶带你玩激光坦克

B - 瑶瑶带你玩激光坦克 Time Limit: 2000/1000MS (Java/Others)    Memory Limit: 256000/128000KB (Java/Others) Submit Status Problem Description 有一款名为激光坦克的游戏,游戏规则是用一个坦克发出激光来达到一些目的,激光可以通过一些镜子反射. 机智的瑶瑶为了显示自己的智商高于常人,把这个游戏改造了一下,变成了用激光攻击敌人的游戏. 瑶瑶想知道射一次激光最多可以攻击到多少个敌人.

Aircrack除破解WiFi密码外的趣味玩法

Aircrack这种屌爆了的攻击测试套件在网上居然只有用它破解WiFi密码的教程,在这里我来扒个冷门,介绍下这款杀器的其他一些有趣的玩法. 0×00:首先你需要一张usb无线网卡 ifconfig查看可以正常识别,如果不行看这里. 0×01:干坏或者不坏的事情前先修改MAC ifconfig [INTERFACE] down#关闭网卡 #[INTERFACE]是指你的无线网卡,一般为wlan0,下不再说明 macchanger -m [MAC] [INTERFACE]#修改MAC,[MAC]是你

企业是怎么玩VMware的

VMware,笔者大四毕设也是玩过一年.不过也就是学生级别的玩弄. 来到企业后,看到更多的名词,更多的使用方法,更有效率的配置. 好吧,来看看企业是怎么使用VMware的. ======================================================================== 故事背景: 单位在全国各地有N个服务器,维护成本比较高,维护不方便. 领导打算把各个地方的服务器迁移到A地,统一管理. 为了达到节约成本,减少机柜数量,方便管理,故障转移,负载均衡

自有手机玩“复活” 中移动想当“山大王”

笔者按:很显然,在这个时代,即使是处于垄断地位的企业在有所动作的时候也得小心翼翼,如履薄冰.因为不知道会出现什么幺蛾子,就会让自己的一番努力前功尽弃.更主要的是,处于垄断地位并不意味着心想事成,而是会眼高手低.自以为是,失败在很多时候都是板上钉钉的事儿. 对于中国移动来说,今年可并不算是一个好运年.在经过3G时代长达数年的被打压之后,原本想凭借4G咸鱼翻身,没想到却困难重重.即使中移动实力雄厚,财大气粗,也不得不黯然接受残酷的事实.于是,中移动不采取种种积极应对的措施. 近日,中移动对外宣布,将