【傻傻分不清楚】 一 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提交
写这篇博客之前,看了博客园里一位前辈写的关于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提交
相关文章推荐
- <!DOCTYPE html>的问题
- LeetCode:Balanced Binary Tree(判断是否为二叉平衡树)
- 线程学习笔记(一)
- 深入理解Linux内核-系统调用
- 用 ROS 做内网DNS服务器
- file样式化
- sublime实用技巧笔记(积累中)
- activemq配置详解
- 浅谈xunsearch、mysql使用及错误总结
- Monkey测试log分析一
- CL_GUI_ALV_GRID 触发PAI事件(Application event)
- 通过SocketLog快速分析OneThink程序
- cocos studio场景和图层的区别
- 前端拼接数组
- JavaScript的jQuery库中function的存在和参数问题
- webx配置html转义构建JSONP跨域
- java调用http接口
- .top域名注册量TOP15:商务中国第四 增速最快
- php取整函数ceil,floor,round,intval函数的区别
- canvas.clipPath canvas.clipRect() 无效的原因