本文写于 2020 年 12 月 30 日javascript
GET 与 POST 是两种 HTTP 方法,而且是最经常使用的两种。html
今天在使用 Postman 测试 api 的时候,突发奇想:在 Get 请求的请求体中写 Body 参数,在 Post 请求中写 Query 参数。java
竟然彻底能够运行!web
对比起我以前看过的一些文章,所谓的 GET 与 POST 的区别,能够说:网上大部分对两者的分析都是错的,GET 和 POST 没有本质的区别。json
GET 的 HTTP 报文彻底是这样的:api
GET /cats?id=1 HTTP/1.1 Host: localhost:3000 Content-Type: application/json Content-Length: 15 { "id": 1 }
GET 也能够是这样的:浏览器
POST /cats?id=1 HTTP/1.1 Host: localhost:3000 Content-Type: application/json Content-Length: 15 { "id": 1 }
发现除了开头的方法不一样,别的彻底是如出一辙的!安全
若是咱们想要知道他们之间的区别,首先咱们得明确:什么是 HTTP?什么是 HTTP 方法?服务器
什么是 HTTP 呢?网络
HTTP 是一种协议,他的设计目的是保证客户端与服务器之间的通讯。
HTTP 的工做方式是客户端与服务器之间的「请求」与「应答」。(这个客户端多是 web 浏览器,也多是须要联网的本地应用程序)
可是这个「请求」与「应答」不能瞎来啊,咱们互相之间得看得懂才行——这就是协议的做用:规定好应该如何请求、应该如何响应。
关于 HTTP 很少作解释,能够看以前一的一篇用简单 Node.js 后台程序看 HTTP 请求。
而 HTTP 方法呢,顾名思义,就是指在客户端和服务器之间进行「请求-响应」时,被用到的方法。
GET 和 POST 各用一句话来描述:
经常会有人分析 GET 与 POST 的区别,这里说一下几个广为流传的“错误答案”,甚至有些 W3C 也是这么写的。
GET 方法的长度限制是怎么回事?真的有限制吗?
有限制的实际上是 URL,若是你愿意把参数写到 GET 请求的 Body 里去,那 GET 请求的长度和 POST 就是同样的了。
而且即便是 URL 的长度限制,那也不是 HTTP 协议的锅。HTTP 协议没有 Body 和 URL 的长度限制,对 URL 限制的大可能是浏览器和服务器的缘由。
浏览器缘由就不说了,服务器是由于处理长 URL 要消耗比较多的资源,为了性能和安全(防止恶意构造长 URL 来攻击)考虑,会给 URL 长度加限制。
而且 POST 也不是没有限制的,只是比较大而已。
按照网上大部分文章的解释,POST 比 GET 安全,由于数据在地址栏上不可见。
然而,从传输的角度来讲,他们都是不安全的!!!
由于 HTTP 在网络上是明文传输的,只要在网络节点上抓包,就能完整地获取数据报文。
要想安全传输,就只有加密,也就是 HTTPS。
咱们必须把 GET 的参数写在 ? 后面,用 & 分割吗?
根本不用。
由于解析报文的过程是经过获取 TCP 数据,用正则等工具从数据中获取 Header 和 Body,从而提取参数。
也就是说,咱们能够本身约定参数的写法,只要服务端可以解释出来就行,一种比较流行的写法是 http://www.example.com/user/name/chengqm/age/22。
参考文章:
99%的人都理解错了 HTTP 中 GET 与 POST 的区别
(完)