POST与GET的详细区别

一、前言

网上大多数介绍都是比较简答的,本文详细介绍了HTTP请求中POST与GET方式的区别。

二、HTTP协议中请求方式

1、HTTP/1.0中,定义了GET、POST、HEADER三种请求方式

2、HTTP/1.1中,新增了五种:PUT、DELETE、OPTIONS、TRACE、CONNECT

但是我们一般在项目中编码经常用到的是GET和POST

三、GET与POST简单区别

1、GET请求在URL中传递参数(有长度限制),POST是在request body中传递参数;

2、POST比GET相对更安全,因为参数不用暴露在URL上;

3、GET只接受ASCII字符,POST没有限制

4、GET请求参数会被完整的保留在浏览器历史记录中,POST不会;

5、GET只能进行url编码(application/x-www-form-urlencoded),POST支持多照片那个编码方式;

6、GET请求会被浏览器主动缓存,POST不会(除非手动设置);

7、GET浏览器回退时是无害的,POST会再次提交表单;

四、GET与POST深入了解

 

1、Q:那Get请求有Request body么?如果有的话参数可以像Post请求一样放在里面么?

A:HTTP的底层是TCP/IP。所以GET和POST底层也是TCP/IP,都是属于TCP连接。要给GET加上request body,给POST带上url参数也是可以的

2、Q:URL中传送参数的长度限制在Get和Post中都是怎么样的呢?

A:不同浏览器处理方式不一样,大多数浏览器通常会限制url长度为2k字节,大多数服务器最多处理64K的url。

如果用GET在request body中传输数据,不同服务器处理方式不一样,有些服务器可以读取,有些直接忽略;所以GET可以request body传参,但是不能保证一定被服务器接收处理。

3、Q:GET 方法参数写法是固定的吗?

A:一般情况下,http://ip:port/test?username=langwang&age=26&sex=2

有些请求会有token认证,所以需要在请求头header中添加自定义属性token,即可以自己约定参数,只要服务器能解析出来就行。

4、Q:是不是POST 方法比 GET 方法更安全呢?

A:有人说POST比GET安全,那是因为POST请求数据在地址栏不可见(当然也有可见的)。

然而从传输角度都是不安全的,因为HTTP在网络上都是明文传输的(可以通过抓包工具抓到对应的明文),要想传输安全,就只能加密,例如:HTTPS方式,或者前后端自己规定的动态加解密秘钥

5、Q:Get、Post请求发送的数据包有什么不同吗?

A:GET请求时产生一个TCP数据包;POST请求时产生两个TCP数据包。

  • GET:浏览器会把http header 和 data一并发送出去,服务器响应200(返回数据);
  • POST:浏览器先 发送header,服务器响应100 continue,浏览器再发出data,服务器响应200 OK(返回数据);

就像是GET只需要汽车跑一趟就把货送到了,而POST得跑两趟,第一趟,先去和服务器打个招呼老铁,我等下要送一批货来,你们准备接收一下哈,然后再回头把货送过去。

并不是说有浏览器都会在POST中的发送两次包,Firefox、Chrome都是只发送一次。