这个已经被广大志同道合的好友们讨论烂的话题,我依旧要再翻一遍,谁让我是菜鸡呢
谈论之前我们先来了解一下什么是get和post
一、原理的区别
我们都知道,网络通常分为两部分,服务端和客户端。就比如说:我访问一个网页,我就是一个客户端,访问的网页就是一个服务端。那么这两者之间是通过什么来交互的呢?就是我们说的网络请求。
HTTP定义了与服务器交互的不同方法:其中最基本的四种方法是:get,post,put,delete.他们对应了,查,改,增,删。
一般我们在浏览器输入网址访问网站的方式都是get请求;在Form表单中,可以通过设置method指定提交数据的方式为post或者get,默认是get方式。
get被称为安全方法,因为使用get的http请求不会产生什么动作。这就意味着get的http请求不会在服务器上产生任何结果。但是安全方法并不是什么动作都产生,这里的安全方法仅仅指的是不会修改信息。
根据http规范,post可能会修改服务器上的资源请求。比如,CSDN的博客,用户提交一片文章是通过post请求来实现的,因为在提交文章后,资源不同了,或者资源被修改了,这些便是不安全方法。
二、实际应用的区别
首先我们来看一下http请求的格式:
<method> <request-URL> <version>
<headers>
<entity-body>
在HTTP请求中,第一行必须是一个请求行,包括请求方法,请求URL,报文所用HTTP版本信息。紧接着是一个herders小节,可以有零个或一个首部,用来说明服务器要使用的附加信息。在首部之后就是一个空行,最后就是报文实体的主体部分,包含一个由任意数据组成的数据块。但是并不是所有的报文都包含实体的主体部分。
get请求的实例
GET http://weibo.com/signup/signup.php?inviteCode=2388493434
Host: weibo.com
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
post请求的实例
POST /inventory-check.cgi HTTP/1.1
Host: www.joes-hardware.com
Content-Type: text/plain
Content-length: 18
item=bandsaw 2647
看完这两种方式的实例,让我们总结一下这两者的区别:
1,请求数据的数据位置
GET请求,请求的数据会附加在URL之后,以?分割URL和传输数据,多个参数用&连接。URL的编码格式采用的是ASCII编码,而不是uniclde,即是说所有的非ASCII字符都要编码之后再传输。
POST请求:POST请求会把请求的数据放置在HTTP请求包的包体中。上面的item=bandsaw就是实际的传输数据。
因此,GET请求的数据会暴露在地址栏中,而POST请求则不会。
2,传输数据的大小
在HTTP规范中,没有对URL的长度和传输的数据大小进行限制。但是在实际开发过程中,对于GET,特定的浏览器和服务器对URL的长度有限制。因此,在使用GET请求时,传输数据会受到URL长度的限制。
对于POST,由于不是URL传值,理论上是不会受限制的,但是实际上各个服务器会规定对POST提交数据大小进行限制,Apache、IIS都有各自的配置。
3,安全性
POST的安全性比GET的高。这里的安全是指真正的安全,而不同于上面GET提到的安全方法中的安全,上面提到的安全仅仅是不修改服务器的数据。比如,在进行登录操作,通过GET请求,用户名和密码都会暴露再URL上,因为登录页面有可能被浏览器缓存以及其他人查看浏览器的历史记录的原因,此时的用户名和密码就很容易被他人拿到了。除此之外,GET请求提交的数据还可能会造成Cross-site request frogery攻击
参考文章: