GET 和 POST请求

Posted Kirl z

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GET 和 POST请求相关的知识,希望对你有一定的参考价值。

1. GET 和 POST 请求的区别

  1. GET 请求再 URL 中传送的参数是有长度限制的, 而 POST 没有
  2. GET 比 POST 相对来说更不安全, 因为参数直接暴露在 URL 中, 所以不能用来传递敏感信息, 而 POST 数据不会显示在 URL 中, 是放在 Request body 中
  3. 对于参数的数据类型, GET 只能接受 ASCII 字符, 而 POST 无限制
  4. GET 请求参数会被完整保留在浏览器历史记录中; 相反, POST 请求参数不会被浏览器保留
  5. GET 请求只能进行 url 编码 (application/x-www-from-urlencoded), 而 POST 支持多种编码方式
  6. GET 请求会被浏览器主动缓存, 而 POST 不会, 除非手动设置
  7. 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 数据, 用正则等工具从数据中获取 HeaderBody, 从何提取参数

有些会在 header 请求头中添加 token, 用来验证用户是否有登录等权限问题

因此, 参数写法是我们可以约定的, 只要服务器可以解析出来就好。

5. GET 和 POST 的安全性

POST 比 GET 更安全, 是因为 POST 数据在 URL 上是不可见的, GET 数据是可见的。

但从传输的角度来说, 他们都是不安全的, 因为 HTTP 协议在网络中是明文传输的, 只要在网络上抓包, 就能够获得完整地数据报文。(和脱裤子放屁一样)

想要安全传输, 就需要加密, 也就是 HTTPS。

6. GET 和 POST 发送数据包

GET: 请求时产生一个 TCP 数据包
POST: 请求时产生两个 TCP 数据包

  1. GET: 浏览器会把 http header 和 data 一并发送出去, 服务器响应200 (返回数据);
  2. POST: 浏览器先发送 header, 服务器响应100 continue, 浏览器再发送 data 服务器响应200 OK(响应数据)

虽然 POST 需要发送两次数据, 理论上应该消耗更多时间, GET 比 POST 更高效, 但并不是的。

  1. GET 和 POST 都有自己的语义不能混用
  2. 在网络环境良好的环境下, 发送一次数据包和两次数据包时间差几乎可以不计; 但在网络环境较差的情况下, 发送两次数据包在验证数据完整性上, 有着更大优势
  3. 并不是所有浏览器都会 POST 发送两次包, FireFox 就只发送一次, Chrome 也是一次

综上所述, POST 和 GET性能差可以忽略

以上是关于GET 和 POST请求的主要内容,如果未能解决你的问题,请参考以下文章

OkHttpOkHttp Get 和 Post 请求 ( 同步 Get 请求 | 异步 Get 请求 | 同步 Post 请求 | 异步 Post 请求 )

AJAX_get请求和post请求实例代码

OC HTTPRequest GET和POST请求的代码封装

Servlet处理GET和POST请求

原生 JS Ajax,GET和POST 请求实例代码

iOS 在线模拟post请求和get请求