get和post的区别?

18,560 阅读4分钟

第一次在掘金上写东西,萌新表示现在瑟瑟发抖,哪里说得不对还望各位大佬纠正┓( ´∀` )┏

最直观的就是语义上的区别

  • get用来获取数据,post用来提交数据
  • get参数有长度限制(受限于url长度,具体的数值取决于浏览器和服务器的限制,最长2048字节),而post无限制。
  • get请求的数据会附加在url之 ,以 " ? "分割url和传输数据,多个参数用 "&"连接,而post请求会把请求的数据放在http请求体中。
  • get是明文传输,post是放在请求体中,但是开发者可以通过抓包工具看到,也相当于是明文的。
  • get请求会保存在浏览器历史记录中,还可能保存在web服务器的日志中

从当前角度来看,post相对get比较安全,至少请求的数据在url上不可见。然而真的只有这些吗???

错,错了?????

  • 那到底安全还是不安全呢?????

这个时候你首先得确定是用什么来定义安全(举个栗子)

  • 你让我爸爸妈妈叔叔阿姨去看这个url,你觉得安全吗?
  • 你让一个初级测试工程师去测试这个接口,你觉得安全不?
  • 你让安全测试工程师去看看get请求呢? 所以人群不同,安全的定义就不一样
  • 真相

首先get和post在本质上都是tcp链接,但由于http协议和浏览器或者服务器的限制,从而使它们在应用过程中产生了差别,但是它们中还有一个较大的区别:get在请求时发送一个数据包,会将header和data一起发送过去,而post会产生两个数据包先发送header,服务器返回100,然后在发送data,服务器返回200

所以当你一层一层的把get和post剖析到底,你会发现他们的本质就是tcp连接,没有啥区别,只是由于http协议规定和浏览器或者服务器的限制,导致他们在应用过程中体现形式不同。

RFC是什么鬼?

前段时间在看到有人在谈论这个问题的时候有人扯出了RFC,那么什么是RFC呢。

  • Request For Comments(RFC),是一系列以编号排定的文件。文件收集了有关互联网相关信息,以及UNIX和互联网社区的软件文件。(来自百度百科)

这样说吧!RFC就是互联网的规范,我们通常所说的协议就是RFC的方式存在,http/1.1规范中RFC7231中涉及到了几个http的方法,其中定义了几个性质:

1.safe(安全)

这里的安全和通常所理解的安全意义不同,就好比如果一个请求的语义本质上就是获取数据(只读),那么这个请求就是安全的。客户端向服务器发起的请求如果没有引起服务器端任何的状态变化,那么他就是安全的而post请求来提交数据必然会是服务器发生相应的变化。从这个维度来看,get请求相对服务器而言,是安全的,post则不安全的。

ldempotend(幂等)

幂等通俗的来讲就是指同一个请求执行多次和仅执行一次的效果完全相等。这里来扯出幂等主要是为了处理同一个请求重复发送的情况,假如在请求响应之前失去连接,如果这个请求时幂等的,那么就可以放心的重发一次请求。所以可以得出get请求时幂等的,可以重复发送请求,post请求时不幂等的,重复请求可能会发生无法预知的后果。

cacheable(可缓存性)

顾名思义,就是一个请求是否可以被缓存,绝大多数部分,post都是不可缓存的(某些浏览器可能支持post缓存),但get是可以缓存的。

勉强理解一下大概就是:

get是请求获取指定资源,get方法时安全、幂等、可缓存的,get方法的报文主体没有任何语义。

post是根据报文主体来对指定资源做出处理,post不安全,不幂等,不可缓存(大部分情况下)。

好了,今天就先扯这么多,有大佬发现不对请帮我纠正纠正,蟹蟹蟹蟹啦!先溜!