Fork me on GitHub

GET和POST区别

GET 和 POST 核心机制与区别

场景一:浏览器的 GET 和 POST

这里特指浏览器中非AjaxHttp请求,即HTTP协议中的GET/POST,浏览器用GET请求来获取一个html页面、图片、cssjs 等资源,用POST请求提交一个<form>表单,并得到一个结果。

GET

获取资源,反复读取不会对访问的数据有副作用,没有副作用被称为‘幂等’。
因为 GET 是读取数据,就可以对 GET 请求的数据做缓存,缓存可以做到浏览器本身(彻底避免浏览器发请求),也可以做到代理上,或者 server 端。

POST

在页面里<form action="/url.do" method="post" >标签会定义一个表单,点击其中的submit元素会发出一个POST请求让服务器做一件事。这件事往往是有副作用的,不幂等的。
不幂等就意味着不能随意多次执行,因此也不能缓存。

GETPOST携带的数据格式也是有区别的,浏览器发出GET请求时分为两种情况,第一种用户自己在浏览器的地址栏输入,第二种点击htmla标签触发了href中的url。其实并不是GET只能用url,而是浏览器直接发出的GET只能由一个url触发。所以如果GET上要在url之外带一些参数就要依靠querystring
浏览器的POST请求都来自表单提交,表单的数据被浏览器编码到 HTTP 请求的 body 里。两种编码方式:application/x-www-form-urlencoded用来传输简单数据,例如:”key1=value1&key2=value2”,multipart/form-data用来传输文件。
浏览器在POST表单数据时,也可以带上参数,直接写在actionurl里。
一般说“GET请求没有body,只有url,请求数据放在urlquerystring中;POST请求的数据在body中“。但这种情况仅限于浏览器发请求的场景。

接口中的 GET 和 POST

这里指通过浏览器的Ajax api,或者iOS/AndroidApphttp clientjavacommons-httpclient/okhttp或者是curlpostman之类的工具发出来的GETPOST请求。此时 GET/POST 不光能用在前端和后端的交互中,还能用在后端各个子服务的调用中(即当一种 RPC 协议使用)。
REST 接口规范、风格,约定了GET,POST,PUT,DELETE,这 4 个接口获取、创建、替换、删除,REST最佳实践还推荐在请求体使用JSON格式。
JSON相对于x-www-form-urlencoded的优势在于: 1. 嵌套结构 2. 可以支持更丰富的数据类型。

安全性

因为 POST 用 body 传输数据,而 GET 用 url 传输,更容易看到,所以 GET 更不安全。但是从攻击角度,无论是 GET 还是 POST 都不够安全,因为 HTTP 本身时明文协议,每个 HTTP 请求和返回的每个 byte 都会在网络上明文传输,不论是 url,header 或 body。
为了避免传输中数据被窃取,必须做从客户端到服务器的端端加密。业界的通行做法就是 https

通常区别

参考

  • GET 在浏览器回退时是无害的,而 POST 会再次提交请求。
  • GET 产生的 URL 地址可以被存为标签,而 POST 不可以。
  • GET 请求会被浏览器主动缓存,而 POST 不会,除非手动设置。
  • GET 请求只能进行 url 编码,而 POST 支持多种编码方式。
  • GET 请求参数会被完整保留在浏览器历史记录里,而 POST 中的参数不会被保留。
  • GET 请求在 URL 中传送的参数是有长度限制的,而 POST 么有。
  • GET 比 POST 更不安全,因为参数直接暴露在 URL 上,所以不能用来传递敏感信息。

实际区别

没有区别,底层都是TCP/IP,并无差别。但是由于HTTP 的规定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同。
Get 请求也可以传输 body,只不过有些服务器直接忽略,浏览器限制 URL 大小 2k,服务器 64k。

区别:GET 产生一个 TCP 数据包;POST 产生两个 TCP 数据包。

对于 GET 方式的请求,浏览器会把 http headerdata 一并发送出去,服务器响应 200(返回数据);

而对于 POST,浏览器先发送header,服务器响应100 continue,浏览器再发送 data,服务器响应 200 ok(返回数据)。

为什么不能使用 GET 代替 POST

  1. GET 与 POST 都有自己的语义,不能随便混用。
  2. 据研究,在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视。而在网络环境差的情况下,两次包的 TCP 在验证数据包完整性上,有非常大的优点。
  3. 并不是所有浏览器都会在 POST 中发送两次包,Firefox 就只发送一次。

为什么不能使用 POST 代替 GET

  • POST 发送两次包
  • POST 不能自动被浏览器缓存
  • POST 不能存为书签
-------------本文结束感谢阅读-------------