浅析GET和POST的区别

发表于:2020-9-22 09:51

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:有猫病1    来源:掘金

  GET和POST最直观的就是语义上的区别:
  1.get用来获取数据,post用来提交数据;
  2.get参数有长度限制(受限于url长度,具体的数值取决于浏览器和服务器的限制,最长2048字节),而post无限制;
  3.get请求的数据会附加在url之,以"?"分割url和传输数据,多个参数用"&"连接,而post请求会把请求的数据放在http请求体中;
  4.get是明文传输,post是放在请求体中,但是开发者可以通过抓包工具看到,也相当于是明文的;
  5.get请求会保存在浏览器历史记录中,还可能保存在web服务器的日志中。
  从当前角度来看,post相对get比较安全,至少请求的数据在url上不可见。然而真的只有这些吗?
  当然不是!
  那到底安全还是不安全呢?
  这个时候你首先得确定是用什么来定义安全(举个栗子):
  你让我爸爸妈妈叔叔阿姨去看这个url,你觉得安全吗?
  你让一个初级测试工程师去测试这个接口,你觉得安全不?
  你让安全测试工程师去看看get请求呢?
  所以人群不同,安全的定义就不一样。
  真相
  首先get和post在本质上都是tcp链接,但由于http协议和浏览器或者服务器的限制,从而使它们在应用过程中产生了差别,但是它们中还有一个较大的区别:get在请求时发送一个数据包,会将header和data一起发送过去,而post会产生两个数据包先发送header,服务器返回100,然后在发送data,服务器返回200。
  所以当你一层一层的把get和post剖析到底,你会发现他们的本质就是tcp连接,没有啥区别,只是由于http协议规定和浏览器或者服务器的限制,导致他们在应用过程中体现形式不同。
  RFC是什么鬼?
  RequestForComments(RFC),是一系列以编号排定的文件。文件收集了有关互联网相关信息,以及UNIX和互联网社区的软件文件。
  这样说吧!RFC就是互联网的规范,我们通常所说的协议就是RFC的方式存在,http/1.1规范中RFC7231中涉及到了几个http的方法,其中定义了几个性质:
  1.safe(安全)
  这里的安全和通常所理解的安全意义不同,就好比如果一个请求的语义本质上就是获取数据(只读),那么这个请求就是安全的。客户端向服务器发起的请求如果没有引起服务器端任何的状态变化,那么他就是安全的而post请求来提交数据必然会是服务器发生相应的变化。从这个维度来看,get请求相对服务器而言,是安全的,post则不安全的。
  2.ldempotend(幂等)
  幂等通俗的来讲就是指同一个请求执行多次和仅执行一次的效果完全相等。这里来扯出幂等主要是为了处理同一个请求重复发送的情况,假如在请求响应之前失去连接,如果这个请求时幂等的,那么就可以放心的重发一次请求。所以可以得出get请求时幂等的,可以重复发送请求,post请求时不幂等的,重复请求可能会发生无法预知的后果。
  3.cacheable(可缓存性)
  顾名思义,就是一个请求是否可以被缓存,绝大多数部分,post都是不可缓存的(某些浏览器可能支持post缓存),但get是可以缓存的。
  勉强理解一下大概就是:
  1.get是请求获取指定资源,get方法时安全、幂等、可缓存的,get方法的报文主体没有任何语义;
  2.post是根据报文主体来对指定资源做出处理,post不安全,不幂等,不可缓存(大部分情况下)。

  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。

《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号