get和post的区别

get和post的区别
  1. 浏览器的GET和POST
    特指浏览器中非Ajax的HTTP请求,从HTML和浏览器诞生就一直使用的HTTP协议中的GET/POST(HTTP协议中的两种发送请求的方法)
  2. 接口中的GET和POST
    这里是指通过浏览器的Ajax api,或者是curl,postman之类的工具发出来的GET和POST请求

二者之间的区别主要包括如下:

  • 从功能上讲:
    GET一般用来从服务器上获取资源,POST一般用来更新服务器上的资源;
    (浏览器用GET请求来获取一个html页面/图片/css/js等资源;用POST来提交一个表单,并得到一个结果的网页)

  • 从REST服务角度上说,
    GET是幂等的,即读取同一个资源,总是得到相同的数据,
    而POST不是幂等的,因为每次请求对资源的改变并不是相同的;
    进一步地,GET不会改变服务器上的资源,而POST会对服务器资源进行改变;

  • 从请求参数形式上看,
    GET请求的数据会附在URL之后,即将请求数据放置在HTTP报文的 请求头 中,以?分割URL和传输数据,参数之间以&相连。
    特别地,如果数据是英文字母/数字,原样发送;否则,会将其编码为 application/x-www-form-urlencoded MIME 字符串(如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密,得出如:%E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII);

    而POST请求会把提交的数据则放置在是HTTP请求报文的 请求体 中。

  • 就安全性而言,
    POST的安全性要比GET的安全性高,因为GET请求提交的数据将明文出现在URL上,
    而且POST请求参数则被包装到请求体中,相对更安全。

  • 从请求的大小看,
    GET请求的长度受限于浏览器或服务器对URL长度的限制(主要是为了提高URL解析的效率),允许发送的数据量比较小,而POST请求则是没有大小限制的。

  • 数据包不同:
    GET请求的时候,产生一个TCP数据包。请求的header和data一起发送出去,服务端返响应具体的状态码。
    POST请求,产生两个TCP数据包。先发送header信息,服务端响应100 continue,浏览器再发送data信息,服务端响应具体的状态码。
    所以说,GET请求的性能要高于POST请求。但是这种差别几乎可以忽略不计。因为网络良好的情况下,两次包发送的时间几乎等于发送一次包的时间(tcp包)。而且,在某些浏览器下,POST请求也只发一次请求(Firefox)

注:GET请求中URL编码的意义
在GET请求中会对URL中非西文字符进行编码,这样做的目的就是为了 避免歧义。看下面的例子,

针对“name1=value1&name2=value2”的例子,我们来谈一下数据从客户端到服务端的解析过程。上述字符串在计算机中用ASCII码表示为:

   6E616D6531 3D 76616C756531 26 6E616D6532 3D 76616C756532
   6E616D6531:name1 
   3D:= 
   76616C756531:value1 
   26:&
   6E616D6532:name2 
   3D:= 
   76616C756532:value2 

  服务端在接收到该数据后就可以遍历该字节流,一个字节一个字节的吃,当吃到3D这字节后,服务端就知道前面吃得字节表示一个key,再往后吃,如果遇到26,说明从刚才吃的3D到26子节之间的是上一个key的value,以此类推就可以解析出客户端传过来的参数。

  现在考虑这样一个问题,如果我们的参数值中就包含=或&这种特殊字符的时候该怎么办?如,“name1=value1”,其中value1的值是“va&lu=e1”字符串,那么实际在传输过程中就会变成这样“name1=va&lu=e1”。这样,我们的本意是只有一个键值对,但是服务端却会解析成两个键值对,这样就产生了歧义。

  那么,如何解决上述问题带来的歧义呢?解决的办法就是对参数进行URL编码:例如,我们对上述会产生歧义的字符进行URL编码后结果:“name1=va%26lu%3D”,这样服务端会把紧跟在“%”后的字节当成普通的字节,就是不会把它当成各个参数或键值对的分隔符

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值