你真的了解 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 ...
随机推荐
- socket通信的三种实现方式
三种 socket 的实现方式 nodejs 下的 socket 服务端代码 const net = require('net') const server = net.createServer() ...
- python学习笔记1 -- 函数式编程之高阶函数 使用函数作为返回值
使用函数作为返回值,看起来就很高端有木有,前面了解过函数名本身就是一个变量,就比如abs()函数,abs只是变量名,而abs()才是函数调用,那么我们如果把ads这个变量作为返回值返回会怎么样呢,这就 ...
- sublime text 配置文件
不慌. 上网上下的clang全是报错,所以就想先配置一下文件. 其实它本来的配置我觉得挺好的. 可能因人而异有些地方还是改了改. 原版有英语注释的,就当是学英语了 // While you can e ...
- 图解 JVM 核心知识点(面试版)
一.基本概念 1.1 OpenJDK 自 1996 年 JDK 1.0 发布以来,Sun 公司在大版本上发行了 JDK 1.1.JDK 1.2.JDK 1.3.JDK 1.4.JDK 5,JDK 6 ...
- MacOS工具
原文是"池建强"的微信文章,公众号为"MacTalk" 1. Alfred 2. iTerm2 一些基本功能如下: 分窗口操作:shift+command+d( ...
- ABPHelper.CLI及其依赖项简单介绍
目录 目录 ABPHelper.CLI 入门 使用指南 命令行 技术点如下 Scriban 通过Microsoft.Extensions.FileProviders.Embedded获取嵌入资源 通过 ...
- luogu P5410 模板 扩展 KMP Z函数 模板
LINK:P5410 模板 扩展 KMP Z 函数 画了10min学习了一下. 不算很难 思想就是利用前面的最长匹配来更新后面的东西. 复杂度是线性的 如果不要求线性可能直接上SA更舒服一点? 不管了 ...
- demo1 动态显示view或弹框 动态隐藏view或弹框
实现界面如上所示: 有一个弹框,弹框上边有一个关闭按钮,点击按钮,可以关闭弹框.点击弹框的周围区域也可以关闭按钮. 点击上边的隐藏弹框也可以关闭按钮. 在实现功能的基础上,以动画的形式展示跟隐藏. 思 ...
- 【可视化-2】将图像当作DSM进行三维显示
上一篇文章中,已经跳出颜色或者亮度的局限,将图像视作一般化的栅格数据,并提供了四种利用颜色和亮度来直观表示栅格间取值差异的可视化方法. 栅格数据的四种可视化方式 这一回,我们又要从一般化走向特殊化.栅 ...
- Qt 应用程序打包成安装文件
欢迎关注公众号: fensnote 文章目录 编译Release版本,拷贝依赖库文件 选择Release模式 使用windeployqt.exe命令提取用到的dll库 使用Inno Setup打包 下 ...