深度分析一下GET 和 POST 究竟有什么区别

HTTP 定义了一组请求方法,以表明要对给定资源执行的操作。这些方法是一组有语义的动词或名字,主要有 GET/HEAD/POST/PUT/DELETE/CONECT/OPTIONS/TRACE/PATCH,我们最常用的是 GET 和 POST,

注意:post的服务方式,在form标签中设置属性,除此之外,所有的提交方式都是get的提交方式

HTTP方法的几个性质

1.Safe- 安全

这里的「安全」和通常理解的「安全」意义不同,如果一个方法的语义在本质上是「只读」的,那么这个方法就是安全的。客户端向服务端的资源发起的请求如果使用了是安全的方法,就不应该引起服务端任何的状态变化,因此也是无害的。 此RFC定义,GET, HEAD, OPTIONS 和 TRACE 这几个方法是安全的。但是这个定义只是规范,并不能保证方法的实现也是安全的,服务端的实现可能会不符合方法语义,正如上文说过的使用GET修改用户信息的情况。引入安全这个概念的目的是为了方便网络爬虫和缓存,以免调用或者缓存某些不安全方法时引起某些意外的后果。User Agent(浏览器)应该在执行安全和不安全方法时做出区分对待,并给用户以提示。

2. Idempotent - 幂等

幂等的概念是指同一个请求方法执行多次和仅执行一次的效果完全相同。按照RFC规范,PUT,DELETE和安全方法都是幂等的。同样,这也仅仅是规范,服务端实现是否幂等是无法确保的。引入幂等主要是为了处理同一个请求重复发送的情况,比如在请求响应前失去连接,如果方法是幂等的,就可以放心地重发一次请求。这也是浏览器在后退/刷新时遇到POST会给用户提示的原因:POST语义不是幂等的,重复请求可能会带来意想不到的后果。

3.Cacheable - 可缓存性

顾名思义就是一个方法是否可以被缓存,此RFC里GET,HEAD和某些情况下的POST都是可缓存的,但是绝大多数的浏览器的实现里仅仅支持GET和HEAD。关于缓存的更多内容可以去看RFC7234。

在这三个特性里一直在强调同一个事情,那就是协议不等于实现:协议规定安全在实现里不一定安全,协议规定幂等在实现里不一定幂等,协议规定可缓存在实现里不一定可缓存。这其实就是上面那个作者提到的specification和implementation的关系。

GET当客户端要从服务器端读取某个资源是,使用GET方法。GET方法要求服务器将URL定位的资源放在响应报文的数据部分,回送给客户端,即向服务器请求某个资源。使用GET方法是,请求参数和对应的值附加在URL后面,用?代表URL 的结尾与请求参数的开始,参数之间用&隔开
POST当客户端给服务器提供信息较多时可以使用POST方法,POST方法向服务器提交数据,比如完成表单数据的提交,将数据提交给服务器处理。GET一般用于获取/查询资源信息,POST会附带用户数据,一般用于更新资源信息。POST 方法将请求参数封装在HTTP 请求数据中,以名称/值的形式出现,可以传输大量数据
HEADHEAD跟GET相似,不过服务端接收到HEAD请求时只返回响应头,不发送响应内容。所以,如果只需要查看某个页面的状态时,用HEAD更高效,因为省去了传输页面内容的时间
DELETE删除某一个资源
OPTIONS用于获取当前URL所支持的方法。若请求成功,会在HTTP头中包含一个名为“Allow”的头,值是所支持的方法,如“GET, POST”
PUT把一个资源存放在指定的位置上
TRACE回显服务器收到的请求,主要用于测试或诊断
CONNECTCONNECT方法是HTTP/1.1协议预留的,能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接与非加密的HTTP代理服务器的通信
Get的特点

GET方法请求一个指定资源的表示形式. 使用GET的请求应该只被用于获取数据.

Post的特点

POST方法用于将实体提交到指定的资源,通常导致状态或服务器上的副作用的更改.

Get比较于Post

GET在浏览器回退时是无害的,而POST会再次提交请求。

GET产生的URL地址可以被加入到书签,而POST不可以。

GET请求会被浏览器主动cache,而POST不会,除非手动设置。

GET请求只能进行url编码,而POST支持多种编码方式。

GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。

GET请求在URL中传送的参数是有长度限制的,而POST么有。

对参数的数据类型,GET只接受ASCII字符,而POST没有限制。

GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。

GET参数通过URL传递,POST放在Request body中。
大多数浏览器通常都会限制url长度在2K个字节,而大多数服务器最多处理64K大小的url。

GET 请求是幂等的,而 POST 不是。

GET请求的页面可以被收藏为书签,POST则相反

GET请求会被浏览器主动cache,而POST不会,除非手动设置

GET在浏览器回退时是无害的,而POST会再次提交请求

GET请求只能进行url编码,而POST支持多种编码方式

GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留

对参数的数据类型,GET只接受ASCII字符,而POST没有限制

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值