您好,欢迎来到叨叨游戏网。
搜索
您的当前位置:首页个人关于GET请求和POST请求的区别理解

个人关于GET请求和POST请求的区别理解

来源:叨叨游戏网

近期学习Ajax,不可避免地就接触到了GET和POST,所以简单谈一谈我对这两个请求的理解。

GET请求

GET请求一般用于向服务器查询某些信息,必要时,需要在GET请求的URL后面添加字符串参数,对XHR而言(XMLHttpRequest对象),查询字符串必须正确编码后添加到URL后面,然后再传给open()方法,由于浏览器对于URL有长度,就会导致用此请求发送数据的长度也有。且由于参数包含在了URL里,导致用户可以直接看到参数的值,安全性不高。

POST请求

POST请求一般用于向服务器发送数据。每个POST请求都应该在请求体中携带提交的数据,而GET请求则不然,POST请求的请求体可以包含非常多的数据,而且数据可以是任意格式。在发送过程中,数据对于用户是不可见的。

区别

上述的一些简单的介绍已经涉及了一些区别,在使用习惯上的区别简单地总结如下:

  • GET后退按钮/刷新无害,POST数据会被重新提交(浏览器应该告知用户数据会被重新提交)。
  • GET书签可收藏,POST为书签不可收藏。
  • GET能被缓存,POST不能缓存 。
  • GET编码类型application/x-www-form-url,POST编码类型encodedapplication/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用多重编码。
  • GET历史参数保留在浏览器历史中。POST参数不会保存在浏览器历史中。
  • GET对数据长度有,当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受的(URL 的最大长度是 2048 个字符)。POST无。
  • GET只允许 ASCII 字符。POST没有。也允许二进制数据。
  • 与 POST 相比,GET 的安全性较差,因为所发送的数据是 URL 的一部分。在发送密码或其他敏感信息时绝不要使用 GET !POST 比 GET 更安全,因为参数不会被保存在浏览器历史或 web 服务器日志中。
  • GET的数据在 URL 中对所有人都是可见的。POST的数据不会显示在 URL 中。

这些貌似就是GET和POST的全部区别了,但是经过我的四处查找,许多文章对此有不同意见,有一篇文章信誓旦旦地说这些都不是我们需要的,GET和POST有一个被称之为大BOSS级别的区别:
对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。

说实话当时差点被那篇文章的语气给渲染了,差点信了,还好我知道货比三家的道理(笑),继续查找了不同人,不同风格的文章。

GET的语义是请求获取指定的资源。GET方法是安全、幂等、可缓存的(除非有 Cache-ControlHeader的约束),GET方法的报文主体没有任何语义。POST的语义是根据请求负荷(报文主体)对指定的资源做出处理,具体的处理方式视资源类型而不同。POST不安全,不幂等,(大部分实现)不可缓存。
其中安全是指是否会对服务器进行修改。不会修改服务器的一般认为是安全的方法。
幂等是指多次重复使用产生的结果是否一致,一致则幂等,反之不幂等。

看到这里可能有人要疑惑了,我学的时候GET会将参数暴露在url中,导致所有人都可见,明明是不安全的呀,而POST会很好地隐藏数据,很安全,为什么这里又说GET安全,而POST安全呢。
注意,此安全非彼安全,两种不同的安全是站在不同角度的,从数据的暴露程度,POST是安全的,GET不安全,从是否会影响到服务器的数据,POST是不安全的,GET是安全的,从攻击的角度,这两者都不怎么安全。

上文还用到了语义一词,也就是说,GET和POST在协议中被要求去承担不同的功能,它们应该是语义中所描述的那样,但是实际的实现不一定能完全地达到(并不是说没有实现,就像GET也可以被用来修改服务器数据一样),剥开那层外衣,它们的本质都是数据传输协议,可以看作是大家共同的一个约定。

参考文章或书籍

知乎问答:
文章:
书籍:JavaScript高级程序设计(第四版)

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- gamedaodao.net 版权所有 湘ICP备2024080961号-6

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务