在HTTP协议下,client与server进行交互有四种基本方法,分别为GET、POST、PUT、DELETE,分别对应为对网站资源的查、改、增、删操作。
GET用于信息的获取,而且它应该是安全和幂等的,所谓安全是针对于server而言的,意即只可查看而无法修改信息;幂等则指对于同一个URL的多个请求应当返回同样的结果。
POST表示可能对server上的资源进行修改的请求,例如,读者对新闻发表自己的评论,则将通过POST实现,因为在评论提交之后站点的资源已经不同了。事实上,对资源的增、删、改、查等操作,均可以通过GET/POST方法来实现,无需用到PUT和DELETE。
再从表面现象上看GET与POST的区别:
1.GET请求的数据会附在url之后(也即把数据放置在HTTP协议头中),以?分割URL和传输数据,参数之间以&相连,如https://www.douban.com/search?source=suggest&q=宫崎葵,如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密,得出如:%E5%AE%AB%E5%B4%8E%E8%91%B5,其中%XX表示为该符号以16进制表示的UTF-8编码。(貌似也可以使用cookie传参,而POST则将数据存放在BODY中。)
2.GET方式提交的数据最多只能是1024字节,理论上POST没有限制,可以传较大量的数据(误:因为GET是通过url提交数据,那么GET可以提交的数据量就跟URL的长度有直接关系,但事实上,URL不存在参数上限的问题,HTTP协议也未对URL长度进行限制。这个限制是特定的浏览器以及服务器对它的限制)
3.在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两种请求中的数据。
4.POST的安全性要比GET的安全性高。注意:这里的「安全」和上面提到的「安全」不是同一个概念。这里的安全是真正的security的含义。比如,通过GET提交数据,那么用户名和密码都会出现在URL上,因为(1)登录页面有可能被浏览器缓存,(2)别人可能会查看浏览器的历史记录从而获取你的账号密码。
至此先总结一下,Get是向服务器发索取数据的一种请求,而Post是向服务器提交数据的一种请求,在FORM(表单)中,Method默认为”GET”,实质上,GET和POST只是发送机制不同,并不是一个取一个发!