GET 和 POST请求,你真的了解吗?

最直观的区别就是 GET 把参数包含在 URL 中,
POST 通过 request.body 传递参数.

本篇是对于很久之前看到的博客做出整理,之前一直记录于有道笔记,今天拿出来分享给大家,希望大家能够从中有所收益。

一般大家都会这么去回答:

  1. GET 在浏览器回退时是无害的,而 POST 会再次提交请求 ;
  2. GET 产生在 URL 地址可以被 Bookmark,而 POST不可以 ;
  3. GET 请求会被浏览器主动 cache,而 POST并不会,除非手动设置 ;
  4. GET 请求只能进行 url编码,而 POST 支持多种编码方式 ;
  5. GET 请求参数会被完全保留在浏览器历史记录里,而 POST 中的参数不会被保留 ;
  6. GET 请求在 URL 中传送的参数是有长度限制的,而 POST 没有限制 ;
  7. GET 只接受 ASCII 字符,而 POST 没有限制 ;
  8. GET 比 POST 更不安全,因为参数直接暴露在 URL上,所以不能用来传递敏感信息 ;
  9. GET 参数通过 URL 传递,POST 放在 Request body 中。

Bookmark: ( 释义:标记)
cache: (释义:隐藏)

这里先纠正一个东西,GET 和 POST的本质上是没有任何区别的,你们信吗?


首先,解释一下 GET 和 POST 是什么 :

GET & POST 是 HTTP协议中的两种发送请求的方法,
HTTP 是基于 TCP/IP 的关于数据如何在万维网,如何去通信的协议
HTTP 的底层是 TCP/IP,
所以,GET/POST 的底层也是 TCP/IP,
也就是说,GET/POST 都是 TCP链接,
GET 和 POST 能做的事情是一样的,如果你给 GET也加上 Request body,
给 POST 加上 url参数,技术上是完全行的通的 !

ps: 觉得绕的同学,可以自己画张图,理解一下


规范 GET,POST 行为 (http协议,TCP)
在万维网世界里,TCP就像是汽车,我们可以用 TCP 来运输数据,它很可靠,从来不会发生“丢件少件”的现象,但是,如果路上跑的全是看起来一模一样的汽车,那这个世界看起来就是一团混乱的。送快件的汽车可能被满载货物的汽车拦堵在路上,整个交通一定会瘫痪的!
由此,“交通规则HTTP”诞生了~
HTTP 给汽车运输设定了好几个服务器类型,例如:GET,POST,PUT,DELETE等,HTTP规定,当执行 GET请求的时候,就要给“汽车”贴上 GET的标签,(这里指的是设置 method 为 GET),而且要求把传送的数据放在 “车顶”上(url中)以方便记录,当执行 POST 请求的时候,要在车上贴上 POST 的标签,并把货物放在车厢里,HTTP只是行为上的准则,而 TCP 才是 GET 和 POST 如何实现的基本 !


顺带提及一下,有关于参数大小的限制,这里做一个比喻,大家自行理解
在万维网的世界里,还有另一个重要的角色:运输公司
不同的浏览器(发起 http请求)和服务器 (接收 http请求)就是不同的运输公司,虽然理论上,你可以在车顶上无限的堆放 “货物”,但是运输公司可不傻,装货和卸货也是有很大成本的,他们会去限制 单词运输量 来控制风险,数据量太大对于浏览器和服务器来讲都是很大的负担。

业界里有一个不成文的规定是:
(大多数)浏览器通常都会限制 url 的长度在 2k个字节,而(大多数)服务器最多只能处理 64k 大小的 url,超出的部分,恕不处理,如果你用 GET 服务,在 request body 偷偷藏了数据,不同服务器的处理方式也是不同的,有些服务器会帮你 “卸货”,独处数据,但有些服务器会直接忽略,所以,虽然 GET 是可以携带 request body 的,但是不能保证一定能被接收到。
ok~ 现在你知道吗 GET 和 POST 本质就是 TCP链接,别无差别,但是由于 HTTP的规定 以及 服务器/浏览器 的限制,导致他们在应用过程中体现出了一些不同。


GET,POST请求步骤:

  • GET请求 ,浏览器会把 http header 和 data 一并发送出去,待服务器响应 200(2开头的http状态码,表示请求成功,200 :成功处理了请求,一般情况下都是返回此状态码; )
  • POST请求,服务器先发送 header, 服务器响应 100 continue, 服务器再去发送 data, 待浏览器响应 200.
  • 就是说,GET只需要汽车跑一次就能把货物送到,而POST需要跑两趟。第一趟:先和服务器打个招呼“hi~, 我等下要送一批货,你们开门等着我”。第二趟:回头把货物过去。

ps: 因为 post 需要两个步骤,所以在时间消耗上会多一点,看起来 GET 比 POST 更有效,因此 Yahoo团毒有人推荐用 GET 替换掉 POST来替换网站性能,但其实更多的舆论并不支持。

  1. GET 和 POST 都有自己的语义,不能随便混用;
  2. 与研究,在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视,而网络环境较差的情况下,两次包 的 TCP 在验证数据包完整性上,却有着非常大的优点;
  3. 并不是所有的浏览器都会在 POST 中发送两次包,举个例子,之前在知乎上看到,有人讲 Firefox 只发送一次,博主自己试了一下,也是如此。

那么现在,你了解到了 POST 和 GET 请求的本质,以后遇到这种类型的问题,大概也有自己的一知半解了,博主整理完之前的笔记,发现有句话说的破有道理 “学而时习之,不会忘”,哈哈。希望本博客对你有所帮助。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值