你真的了解 get 和 post 的区别么
get 和 post 是两种最常用的 HTTP 请求方法,要说它们两个的区别,相必接触过 WEB 开发的人都能够说出一二。
如果我问你这个问题,你的内心充满了自信和喜悦。你可能已经写过无数个 GET 和 POST 请求,也可能看过很多“权威网站”总结出的他们的区别,你非常清楚知道什么时候该用什么。
于是你在心里默念...
从本质上来说,get 是向服务器请求数据,而 post 是向服务器提交要被处理的数据。
最直观的区别是 get 的请求参数是在 url 中发送的,而 post 的请求参数是在 HTTP 消息主体中发送的。
然后你轻轻松松、潇潇洒洒的给出了一个“标准答案”:
标准答案
- get 在回退和刷新时是无害的,post 的数据会被重新提交。
- get 的参数可以被书签和历史记录保存,post 的参数不能被书签和历史记录保存。
- get 只支持 url 分割(application/x-www-form-urlencoded)的格式,post 支持多种编码格式,如:url 分割、FormData、text/plain、json 等。
- get 在 url 中添加的参数有长度限制,post 的参数长度没有限制。
- get 只允许 ASCII 字符的数据类型,post 没有数据类型的限制。
- get 相对 post 来说安全性较差,因为 get 的参数直接在 url 中对所有人可见。因此不要在发送密码或其他敏感信息时使用 get 方法。
以上标准答案来自于:w3school
get 和 post 本质上没有区别
很遗憾,这并不是我期待的答案!如果我告诉你 get 和 post 本质上没有区别 ,你信么?
要想说清楚这个问题,我们就要先回到一切开始的地方。
get 和 post 是什么?get 和 post 是两种最常用的 HTTP 请求方法。
那么 HTTP 又是什么?HTTP 是基于 TCP/IP 进行客户端和服务器之间通信的超文本传输协议。
HTTP 的底层是 TCP/IP 。所以 GET 和 POST 的底层也是 TCP/IP ,也就是说,GET/POST 都是TCP链接。GET 和 POST 能做的事情是一样一样的。你把 GET 参数加到 HTTP 消息主体中,或者给 POST 带上 url 参数,技术上是完全行的通的。
get 和 post 的区别是怎么来的
看到这里你又会问了,既然没有区别,那么上面的“标准答案”又是怎么回事?
注意,并没有人说“标准答案”有误。只是上边的区别是依赖于浏览器/服务器而存在的。
数据传输就相当于货物运输,装货和卸货就相当于数据的发送和接收。如果运输公司(浏览器和服务器)不对货物运输进行规范,任由他们无限的堆积货物、随意的隐秘货品。那么势必会对运输公司造成负担,产生很大额外的经济成本。所以他们就协商了一套业内规范(HTTP 协议),不同的货物用不同的装载方式(不同的请求方法),装载货物的多少也进行了限制(浏览器一般限制 url 长度在 2K 内,服务器最多处理 64K 大小的 url)。
所以看到这里你应该明白了吧。GET 和 POST 本质上都是 TCP 链接,并无差别。由于 HTTP 的规范和浏览器/服务器的限制,才导致他们在浏览器的实际应用过程中体现出一些不同。
看到这里也就结束了。现在,当其他人再问你 get 和 post 的区别,你终于可以安安稳稳的装 13 了。
参考
- 99%的人都理解错了HTTP中GET与POST的区别:https://mp.weixin.qq.com/s?__biz=MzI3NzIzMzg3Mw==&mid=100000054&idx=1&sn=71f6c214f3833d9ca20b9f7dcd9d33e4#rd
- W3School:HTTP 方法:GET 对比 POST:http://www.w3school.com.cn/tags/html_ref_httpmethods.asp
你真的了解 get 和 post 的区别么的更多相关文章
- 你真的了解word-wrap和word-break的区别吗?
这两个东西是什么,我相信至今还有很多人搞不清,只会死记硬背的写一个word-wrap:break-word;word-break:break-all;这样的东西来强制断句,又或者是因为这两个东西实在是 ...
- 你真的了解word-wrap和word-break的区别吗? (转载)
这两个东西是什么,我相信至今还有很多人搞不清,只会死记硬背的写一个word-wrap:break-word;word-break:break-all;这样的东西来强制断句,又或者是因为这两个东西实在是 ...
- 你真的知道em和rem的区别吗?
前言 em 和 rem 都是相对单位,在使用时由浏览器转换为像素值,具体取决于您的设计中的字体大小设置. 如果你使用值 1em 或 1rem,它可以被浏览器解析成 从16px 到 160px 或其他任 ...
- 【转】你真的了解word-wrap和word-break的区别吗?
原文在这里: http://www.cnblogs.com/2050/archive/2012/08/10/2632256.html
- 你真的了解MyBatis中${}和#{}的区别吗?
动态sql是mybatis的主要特性之一.在mapper中定义的参数传到xml中之后,在查询之前mybatis会对其进行动态解析. mybatis提供了两种支持动态sql的语法:#{} 和 ${}. ...
- python2和3在处理字符串上的区别
python2和3在处理字符串上的区别 python2和python3对于字符串的处理有很大的区别 熟悉了python2的写法用python3时真的会遇到很多问题啊…… 区别 python2中有一 ...
- 【.Net底层剖析】3.用IL来理解属性
.Net底层剖析目录章节 1.[深入浅出.Net IL]1.一个For循环引发的IL 2.[.Net底层剖析]2.stfld指令-给对象的字段赋值 3.[.Net底层剖析]3.用IL来理解属性 未完待 ...
- 越狱Season 1-Episode 4: Cute Poison
Season 1, Episode 4: Cute Poison [Previously on Prison Break] previously: 以前地 前情提要 -Burrows: I didn' ...
- 英文长单词断行 word-break VS word-wrap
你真的了解word-wrap和word-break的区别吗? 这两个东西是什么,我相信至今还有很多人搞不清,只会死记硬背的写一个word-wrap:break-word;word-break:brea ...
随机推荐
- Visio的快速使用和功能理念
以前我对visio这种Microsoft办公套件并不感冒,觉得完全没必要用Visio作图,最多用一下Process on,其他基本用Xmind解决问题了.但是最近几次工作需要接触之后发现,Visio还 ...
- PHP操作Redis步骤详解
一.Redis连接与认证 $redis = new Redis(); //连接参数:ip.端口.连接超时时间,连接成功返回true,否则返回false $ret = $redis->connec ...
- 常用mongo使用方式(限本人)
mongoose连接详情参考官网 在项目中新建db文件夹 connect.js连接mongo: const mongoose=require('mongoose'); mongoose.connect ...
- Django学习路10_创建一个新的数据库,指定列名并修改表名
在 models.py 中添加 from django.db import models # Create your models here. class Person(models.Model): ...
- 两数相加(B站看视频总结)
''' 两数相加: 给出两个 非空 的链表用来表示两个非负的整数 各自的位数是按照逆序的方式存储的 每一个节点只能保存 一位数 示例: 输入:(2->4->3) + (5->6-&g ...
- 不看会后悔系列之idea的使用小技巧
虽然用idea已多达N年,但你对其所有的功能都了如指掌吗?了解如下小tips助你开发更通畅. 调试专题 (1)不用每次都重启debugdebug程序时,只修改了一点代码,怎么在不重启程序的前提下,看到 ...
- CF 633 div1 1338 B. Edge Weight Assignment 构造
LINK:Edge Weight Assignment 这场当时没打 看到这个B题吓到我了 还好当时没打. 想了20min才知道怎么做 而且还不能证明. 首先考虑求最小. 可以发现 如果任意两个叶子节 ...
- idea修改module name后重启失效
技术交流群 : 816227112 idea每次修改module name后重启,module还是会在后面加上原来的name. 这时修改: .idea下的modules.xml 内的module名即可 ...
- Elasticsearch和Scala类型转换
Scala Type ES Unit null None null Nil empty array Some[T] according to the table Map object Traver ...
- springMVC 与 html RESTful 解决方案
若前端为html 而非jsp 且 拦截如下 <servlet-mapping> <servlet-name>springMVC</servlet-name> &l ...