GET和POST的区别

4

一、GET和POST

  • GET用于获取信息,是无副作用的,是幂等的,且可以缓存的。
  • POST用于修改服务器上的数据,有副作用,非幂等的,不可缓存。

二、报文的区别

GET和POST没有实质的区别,只是报文格式的不同

GET和POST只是HTTP协议中的两种请求方式,而HTTP协议是基于TCP/IP的应用层协议,无论是GET还是POST,用的都是同一个传输层协议,所以在传输上没有区别。

报文格式上,不带参数时,最大的却别是第一行方法名不同。POST方法请求报文第一行是:POST /uri HTTP/1.1 \r\n,而GET方法请求报文第一行是:GET /uri HTTP/1.1 \r\n

所以,不带参数的时候,它们的区别仅仅就是报文前面几个字符不同而已,至于带参数的报文的区别就是:约定GET方法的参数应该放在url中,POST方法参数应该放在body中。

例如:如果参数是:page=2,name=bitbo,那么GET方法的报文头部前面可能是:

GET /book?page=2&name=bitbo HTTP/1.1
Host: localhost

POST方法简约版报文可能是:

POST /book HTTP/1.1
Host: localhost
Content-Type: application/x-www-form-urlencoded

page=2%name=bitbo

所以,其实两种方法的本质上是TCP连接,没有差别,也就是说,如果不按规范来也是可以,只要前后端约定好怎么传递参数就可以。也就是说可以在URL上写参数,然后方法使用POST;也可以在body写参数,然后方法使用GET,只要后端服务支持这种传参方式就可以。

三、常见问题

1、GET方法参数写法是固定的吗?

在常见约定中,我们的参数是写在?后面,用&分割每个参数。

而后端服务在解析报文的过程是用过获取TCP数据,用正则等工具从数据中获取Header和Body,从而提取参数。也就是说,我们可以约定自己的写法,只要服务端可以解析出来就可以,比如GO语言常用的WEB框架gin,常用的写法是:https://www.bitbo.com/book/page/12/name/bitbo,或者直接前后端约定好参数位置https://www.bitbo.com/book/12/bitbo,也可以用常用的?&方式。

2、POST方法比GET方法安全?

按照网上大部分文章的解释,POST比GET安全,因为数据在地址栏不可见。然而,从传输的角度来说,POST和GET方式都是不安全的,因为HTTP在网络上是明文传输的,只要在网络节点上抓包,就能完整的获取数据报文。要想安全传输就只有加密,也就是加上安全协议,使用HTTPS协议

3、GET方法的长度有限制?

网上大部分的观点在评论者POST和GET的时候都有这一条,提到游览器地址栏输入的参数是有限的。然而HTTP协议其实并没有Body和URL的长度限制,对URL的限制大多是游览器和服务器的原因,比如服务器出于性能和安全的考虑,防止恶意构造长URL来攻击,处理长URL会消耗比较多的资源。所以给URL长度加上限制。

4、POST方法会产生两个TCP数据包?

有些文章提到,POST会将Header和body分开发送,先发送Header,服务器返回100状态码再发送body。然而HTTP协议并没有明确说明POST会产生两个TCP数据包,所以header和body分开发送是部分游览器或者框架的请求方式,并不属于post必然行为。