最直观的区别就是 GET 把参数包含在 URL 中,
POST 通过 request.body 传递参数.
本篇是对于很久之前看到的博客做出整理,之前一直记录于有道笔记,今天拿出来分享给大家,希望大家能够从中有所收益。
一般大家都会这么去回答:
- GET 在浏览器回退时是无害的,而 POST 会再次提交请求 ;
- GET 产生在 URL 地址可以被 Bookmark,而 POST不可以 ;
- GET 请求会被浏览器主动 cache,而 POST并不会,除非手动设置 ;
- GET 请求只能进行 url编码,而 POST 支持多种编码方式 ;
- GET 请求参数会被完全保留在浏览器历史记录里,而 POST 中的参数不会被保留 ;
- GET 请求在 URL 中传送的参数是有长度限制的,而 POST 没有限制 ;
- GET 只接受 ASCII 字符,而 POST 没有限制 ;
- GET 比 POST 更不安全,因为参数直接暴露在 URL上,所以不能用来传递敏感信息 ;
- 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来替换网站性能,但其实更多的舆论并不支持。
- GET 和 POST 都有自己的语义,不能随便混用;
- 与研究,在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视,而网络环境较差的情况下,两次包 的 TCP 在验证数据包完整性上,却有着非常大的优点;
- 并不是所有的浏览器都会在 POST 中发送两次包,举个例子,之前在知乎上看到,有人讲 Firefox 只发送一次,博主自己试了一下,也是如此。
那么现在,你了解到了 POST 和 GET 请求的本质,以后遇到这种类型的问题,大概也有自己的一知半解了,博主整理完之前的笔记,发现有句话说的破有道理 “学而时习之,不会忘”,哈哈。希望本博客对你有所帮助。