要了解Http(Hyper Text Transfer Protocol(超文本传输协议))与服务器的交互,先大概介绍下http是什 么,其实就是一些人写出来的规则,用来规定了浏览器和万维网服务器之间互相通信的规则,所谓的通信主要是指 浏览器与服务器之间的数据传递,所以也可以说http是用于从WWW服务器传输超文本到本地浏览器的传送协议的传 送协议。协议本身共定义了八种方法,分别为:
OPTIONS,HEAD,GET,POST,PUT,DELETE,TRACE,CONNECT。
大家可能对有些很陌生,比如options,trace等,这都是正常的,最常用的无非就两种,post和get,为什么 其他的六种不常用呢,因为早期的Web MVC框架设计者们并没有有意识地将URL当作抽象的资源来看待和设计,所以 导致一个比较严重的问题是传统的Web MVC框架基本上都只支持GET和POST两种HTTP方法,而不支持其他方法。实际 上,现在没有任何一个浏览器支持GET/POST之外的任何verb,
所以本文主要简单谈谈post和get的区别。
1.GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。2.GET请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),以?分割URL和传输 数据,参数之间以&相连,如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0%E5%A5%BD。如 果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加 密,得出如:%E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII。,所以用get方法提交请求的 时候,在URL中会毫不客气的把信息暴露出来,比如登陆form用了get请求,那么你的用户名和密码将能直接看到, 这是非常不安全的,因为
(1)登录页面有可能被浏览器缓存。
(2)其他人或软件查看浏览器的历史纪录,那么别人就可以拿到你的账号和密码了。
(3)使用GET提交数据还可能会造成Cross-site request forgery攻击(风险在于那些通过基于受信任的输入 form和对特定行为无需授权的已认证的用户来执行某些行为的web应用。已经通过被保存在用户浏览器中的cookie 进行认证的用户将在完全无知的情况下发送HTTP请求到那个信任他的站点,进而进行用户不愿做的行为)。POST把 提交的数据则放置在是HTTP包的包体中(在HTML HEADER内提交)。这样对于用户来说是不透明的,相比较而言,安 全了许多。
3.两种方式提交数据大小的限制:理想情况下两种方式提交数据大小是没有限制的,可能看到这里绝大多数人都不认同,别急,我说的是理想情 况,请继续往下看。
GET方式提交的数据最多只能是2048字节,因为GET是通过URL提交数据,那么GET可提交的数据量就跟URL的长度有 直接关系了。而实际上,URL不存在参数上限的问题,HTTP协议规范没有对URL长度进行限制,这就是为啥我说没有 限制的原因了。这个限制是特定的浏览器及服务器对它的限制。IE对URL长度的限制是2083字(2K+35), 注意这是 限制是整个URL长度,而不仅仅是你的参数值数据长度。对于其他浏览器,如Chrome,Netscape,Safari,FireFox 等(国内的浏览器就不说了,没有独家技术,忽略不计),理论上没有长度限制,其限制主要取决于操作系统的支 持。POST是没有大小限制的,HTTP协议规范也没有进行大小限制,但是别忘了还有服务器对他的限制,IIS 4 中为 80 KB 字节,IIS 5 中为 100 KB 字节, IIS 6.0默认ASP POST数据量最大为200KB,每个表单域限制是100KB。 IIS 6.0默认上传文件的最大大小是4MB。IIS 6.0默认最大请求头是16KB。IIS 6.0之前没有这些限制,不过这些都能改。
4.再有就是服务器端获取参数的区别了在ASP中,服务端获取GET请求参数用Request.QueryString,获取POST请求参数用Request.Form。在JSP中,用 request.getParameter(\"XXXX\")来获取,虽然jsp中也有request.getQueryString()方法,但使用起来比较麻烦, 比如:传一个test.jsp?name=hyddd&password=hyddd,用request.getQueryString()得到的是: name=hyddd&password=hyddd。在PHP中,可以用$_GET和$_POST分别获取GET和POST中的数据,而$_REQUEST则可以获 取GET和POST两种请求中的数据。值得注意的是,JSP中使用request和PHP中使用$_REQUEST都会有隐患。
总结:实际上两者只是发送机制不同而已,
举个例子
Get对服务器说:我要查看老板给我们部门的小伙伴分别发了多少工资。
Post对服务器说:我要老板发给我的工资1000块改成2000块。
这取决于http协议的规定,并不是大家常说的get用于取数据,post用于发数据。
相信大家看了这篇文章应该大致知道什么时候用get什么时候用post了吧。