1. GET 和 POST 请求的区别
- GET 请求再 URL 中传送的参数是有长度限制的, 而 POST 没有
- GET 比 POST 相对来说更不安全, 因为参数直接暴露在 URL 中, 所以不能用来传递敏感信息, 而 POST 数据不会显示在 URL 中, 是放在 Request body 中
- 对于参数的数据类型, GET 只能接受 ASCII 字符, 而 POST 无限制
- GET 请求参数会被完整保留在浏览器历史记录中; 相反, POST 请求参数不会被浏览器保留
- GET 请求只能进行 url 编码 (application/x-www-from-urlencoded), 而 POST 支持多种编码方式
- GET 请求会被浏览器主动缓存, 而 POST 不会, 除非手动设置
- GET 在浏览器回退时是无害的, 而 POST 会再次提交请求
2. 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 参数, 是可以实现的。
但若是所有的方法都一模一样, 就无法区分操作, 所以 HTTP 给不同的操作赋予不同的方法, GET, POST, PUT, DELETE等等
HTTP 规定, 在执行 GET 请求时, 要带上 GET 标签 (设置 method 为 GET), 而且要求把传送的数据放在最上面 (url), 以便记录。
POST 请求, 就要带上 POST 标签, 将传送数据放到内部 (Request body中)。
当然 GET 请求时, 也可以在Request body 中放点数据; POST 请求时, 在 url 存些数据, 不过比较傻。
HTTP 本质上是一个行为准则, 而 GET 和 POST 本质就是 TCP 连接。但由于 HTTP 的规定和浏览器/服务器的限制, 导致在应用过程中体现出差异。
3. URL 中传送参数长度限制
在不同的浏览器 Client 端 (发起 http 请求) 和服务器 server 端 (接受 http 请求) 有着不同的限制。
虽然, 理论上可以在 URL 中无限添加参数, 但浏览器和服务器在解析时也是有很大成本, 用限制参数来控制风险, 数据量太大会对服务器和浏览器都是很大负担
大多数浏览器通常会把 url 长度限制在 2k 个字节, 大多数服务器最多处理 64k 大小 url
超过的部分, 不会处理。 如果你用 GET 服务, 在 Request body 中偷偷藏了数据, 不同浏览器的处理方式也是不同的, 有些服务器会帮你处理, 读出数据, 有些服务器直接忽略
所以 GET 虽然可以带 Request body, 但不能验证是否被接收到
4. GET 方法参数写法
在约定中, 我们参数是写在 ? 后面, 用 & 连接
http://ip:port/test/getHelloWorld?username=Kirlz&age=21&sex=1
在解析报文的过程中, 是通过获取 TCP 数据, 用正则等工具从数据中获取 Header 和 Body, 从何提取参数
有些会在 header 请求头中添加 token, 用来验证用户是否有登录等权限问题
因此, 参数写法是我们可以约定的, 只要服务器可以解析出来就好。
5. GET 和 POST 的安全性
POST 比 GET 更安全, 是因为 POST 数据在 URL 上是不可见的, GET 数据是可见的。
但从传输的角度来说, 他们都是不安全的, 因为 HTTP 协议在网络中是明文传输的, 只要在网络上抓包, 就能够获得完整地数据报文。(和脱裤子放屁一样) 想要安全传输, 就需要加密, 也就是 HTTPS。
6. GET 和 POST 发送数据包
GET: 请求时产生一个 TCP 数据包 POST: 请求时产生两个 TCP 数据包
- GET: 浏览器会把 http header 和 data 一并发送出去, 服务器响应200 (返回数据);
- POST: 浏览器先发送 header, 服务器响应100 continue, 浏览器再发送 data 服务器响应200 OK(响应数据)
虽然 POST 需要发送两次数据, 理论上应该消耗更多时间, GET 比 POST 更高效, 但并不是的。
- GET 和 POST 都有自己的语义不能混用
- 在网络环境良好的环境下, 发送一次数据包和两次数据包时间差几乎可以不计; 但在网络环境较差的情况下, 发送两次数据包在验证数据完整性上, 有着更大优势
- 并不是所有浏览器都会 POST 发送两次包, FireFox 就只发送一次, Chrome 也是一次
综上所述, POST 和 GET性能差可以忽略
|