您的位置:首页 > 其它

【傻傻分不清楚】 一 Get和Post

2015-08-13 10:23 162 查看
废话:面试的时候经常会被问到这样的问题,说说**和**的区别...而且做项目也会被这个问题困扰,解决办法无非就是在网上搜搜人家怎样谈区别的,但是自己并没有真正理解,只知其一,下次再遇到,又去百度,周而复始,事倍功半,索性写一个系列来仔细分析下这些数据结构,嗯,开始吧!

写这篇博客之前,看了博客园里一位前辈写的关于get、post区别的文章,更是一头雾水,原文:GET和POST有什么区别?及为什么网上的多数答案都是错的。瞬间颠覆我之前的观点,于是各种找资料,参考浅谈HTTP中Get与Post的区别,总算有了一点眉目,get和post是http协议传送数据的两种方式,那就先来看看http是怎样工作的。http工作原理非常详细的分析了http通信的工作流程。简单总结了下,Http工作步骤:

1.建立连接

浏览器(客户端)通过网络,用tcp建立与服务器的连接,默认端口为80.

2.打包数据

浏览器分析请求地址,从中分解出协议名(http)、主机名(www.baidu.com)、端口、对象路径,这个过程需要DNS解析域名得到主机IP.(这就是为什么很多时候能上QQ,但是不能刷网页的原因,因为dns解析出的ip地址是错误的),然后将分解出的各个部分,结合主机信息打包为请求报文。

3.发送请求报文

请求报文由请求行、请求头部、空行和请求数据4部分组成。

4.服务器接收请求并响应

一个响应由状态行、响应头部、空行和响应数据4部分组成。状态行包含(信息的协议版本号、成功or错误代码、mime信息),响应信息发送完毕后,服务器会发送一段空白行,表示响应头部结束,然后再发送实际请求数据。

5.断开连接

服务器主动关闭tcp,如果浏览器在请求头信息中加入connection:keep-alive,那么tcp始终保持打开,浏览器可继续发送请求。

6.客户端浏览器解析HTML内容

客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。

至此,http工作流程弄清楚了,再回到get和post上就比较容易分析,Get/Post是http协议同服务器交互的多种方法之二,最基本的还有两种put、delete,四种方法对应增、删、改、查,所以Get用于提交资源,Post用于更新资源

感官上来说,Get请求参数跟在URL地址后,以?-&的形式传递,字符转义引用一下前辈的话“如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密,得出如:%E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII”。Post则是以数据包的形式

安全性来说,Get请求的数据,即使敏感参数也会明文出现在URL中,Post则不会。

服务器端来说,获取GET请求参数用Request.QueryString,获取POST请求参数用Request.Form,至于这两种获取数据的方式异同和优先级,我会以本系列另一篇博文在说明。

发送数据大小来说,GET方式提交的数据最多只能是1024字节,Post则没有限制,这个说法,其实存在质疑,Get提交数据大小受限,无非是URL长度受限,而Http并没有对URL长度作出限制,只是不同的浏览器会有限制。

说了这么多,如果以后再被问到这个问题,就用上面黑体字回答他。

有大神针对Get、Post专门做过实验,参考ASP.NET MVC3中关于httppost提交



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: