标签:
一、POST/GET之我所见
其实对于他们的区别,想必互联网上已经传遍了,无论大家怎么理解,对于我而言,我觉得,它们只有一个区别。
就是一个有form,一个没有。
怎么理解了,就是POST上传就类似我们在界面上的一个<form>,按下提交按钮后把form内的东西都传递到服务器去,当然你也可以不传递任何东西,如果在ajax的send时不传递任何东西,此时是没有form的,但但凡send里面有了数据,就自然有了form(包括abc=123这样的以及new FormData()),因此,他们的区别仅仅是是否有form,至于传输数据大小其实没有什么区别的,一般说的1024字节的GET限制也不存在的(受限于服务器的最大传输,.NET一般是4M),只是GET不方便传输文件等数据,所以一般用于获取信息,需要注意的是,由于GET有安全性和幂等性,可能造成GET方式的执行时并不每次都提交到服务器,而是使用浏览器缓存(具体和浏览器设置相关)。
二、通信数据
再来说说他们的具体传递流程
客户端(cookie)→服务器(cookie)→客户端(cookie)
上面的一个流程就是通常的传递,其中cookie不但包含的普通的数据,还包含了sessionId(特殊设置下不包含,可以分离,然后附加在地址上),但这个sessionId并不保存,而是浏览器一旦关闭就清除,而每完成一次这样的过程,服务器和浏览器就断开了,下一次请求时重新连接,而此时服务器怎么知道还是同一个用户在访问呢,就是读取这个sessionId,服务器是有保存的,用户第一次访问时服务器分配给用户后,服务器也保存一份,保存时间默认是20分钟,如果再次期间再次访问,保存时间往后延迟。
三、Session处理
不管是POST还是GET都发送了sessionId到服务器,但可能偶尔服务器无法获取到session,主要是ashx页面,因为它默认不处理session,如果需要,则请加上接口
public class ajax : IHttpHandler,System.Web.SessionState.IRequiresSessionState { }
四、最后说说FROM
前面说了GET和POST就是有无FROM的区别,而不是Session,那我来说说FORM吧,其实FORM里面就是传统页面里面的<form>标签,它主要是保存页面的数据,用于还原页面和提交数据用途,主要就是把form里面的input的value传递到服务器,因此包含普通的input按钮和文本以及文件(文件需要有name属性),同时.NET等服务器控件和页面内容(ViewState)为了在返回服务器时能获取页面当前的输入状态,把数据也保存到了FORM里面,如果查看代码,会看到诸如
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKLTI0MTIwNDkwOWRkqKPcG1XuXZzRRu6RJ29YmbSvowNSKXFypkaJO+W5kmo=" />
的东西,这个就是隐藏的一个input,就是用于存储页面上的服务器控件信息的(value内容就是普通的Base64String字符串),当然,如果页面上没有服务器控件,也可能不存在这个东东了(实际上还是有,会保存其他东东)。
因此一旦提交页面,就相当于把当前有用的东西都提交到服务器去了,然后服务器分析自己的__VIEWSTATE来重建一个页面CLASS,然后恢复其页面的控件状态,然后处理input的东东,最后返回给浏览器HTML代码。
对于GET方式,是没有FORM的,但对于POST,其实也没有,但,可以附加,如果发送了诸如abc=123&efg=456的数据,会自动添加一个form,然后把数据装进去发走,当然也可以自己发送一个虚拟的form,只需要new FormData()
new FormData().append(name, object);
然后send这个对象即可,这样的好处是可以发送文件了(input.files[0]从input中获取,后台直接request.Files就可以收取了),否则就和GET没啥区别了。
不过要注意form的编码格式,否则可能错误的。
详见我的另一篇笔记:http://www.cnblogs.com/21tcy/p/4814673.html
标签:
原文地址:http://www.cnblogs.com/21tcy/p/4973202.html