你真的了解 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 ...
随机推荐
- 3. 懂了这些,方敢在简历上说会用Jackson写JSON
你必须非常努力,才能看起来毫不费力.本文已被 https://www.yourbatman.cn 收录,里面一并有Spring技术栈.MyBatis.JVM.中间件等小而美的专栏供以免费学习.关注公众 ...
- Lua学习入门(代码块)
). if then else if a < then b = else b = end ). if elseif else then if a < then b = elseif a = ...
- Django学习路10_创建一个新的数据库,指定列名并修改表名
在 models.py 中添加 from django.db import models # Create your models here. class Person(models.Model): ...
- centOS7.*安装nginx和简单使用
安装nginx 去官网下载对应的nginx包,推荐使用稳定版本. 上传下载好的包到服务器 安装依赖环境 安装gcc环境. yum install gcc-c++ 安装PCRE库,用于解析正则表达式. ...
- Python os.close() 方法
概述 os.close() 方法用于关闭指定的文件描述符 fd.高佣联盟 www.cgewang.com 语法 close()方法语法格式如下: os.close(fd); 参数 fd -- 文件描述 ...
- PHP ftp_ssl_connect() 函数
定义和用法 ftp_ssl_connect() 函数打开一个安全的 SSL-FTP 连接. 当连接打开,您就可以在服务器运行 FTP 函数. 语法 ftp_ssl_connect(host,port, ...
- PHP vsprintf() 函数
实例 把格式化字符串写入变量中: <?php高佣联盟 www.cgewang.com$number = 9;$str = "Beijing";$txt = vsprintf( ...
- Mybatis 的连接池技术
我们在前面的 WEB 课程中也学习过类似的连接池技术,而在 Mybatis 中也有连接池技术,但是它采用的是自 己的连接池技术.在 Mybatis 的 SqlMapConfig.xml 配置文件中,通 ...
- 00-基础SQL-SELECT语句
DML(数据操作语言,增删查改)DDL(数据定义语言,比如创建.修改或删除数据库对象)DCL(数据控制语言,控制数据库的访问) desc 表名:显示表结构:dual : 伪表 对于日期型数据,做 * ...
- iOS开发多线程在实际项目中的运用
实际项目开发中为了能够给用户更好的体验,有些延时操作我们都会放在子线程中进行. 今天我们就来聊聊多线程在实际项目中的运用. 我们先来看看多线程的基础知识: 1.多线程的原理: 同一时间,CPU只能处理 ...