我们会经常看到有人问:http协议中GET请求和POST请求有什么区别~?

这个问题看似很简单,但是不同程度的人会回答出不同的结果。在公司的面试中,也会经常的问及类似这样的问题,看似很简单,但是不同层次的人会回答出不同的结果。那么我们今天就来聊聊HTTP协议中GET与POST的真正区别。

我们还是要用一句简练的话来回答GET和POST的区别:

提及GET和POST的区别,一定要确定基于什么前提。在不同的前提下有不同的答案。


这么简单的GET和POST背后有什么神秘的面纱呢?我们今天就用举例子来讲给大家~

//////////

邓哥家住在吃鸡村,邓嫂家住在农药屯。邓哥到邓嫂家可以有很多种选择,走着去、驾车去、坐火车去等等。邓哥通常选择驾车过去。

这里吃鸡村和农药屯就相当于是互联网中的两台计算机,邓哥和邓嫂相当于是这两台计算机中的两个程序,这两个程序之间想要通信可以有很多种协议,就好比有很多种交通方式可以到达。我们假设驾车这种方式就是网络中的HTTP协议。

邓哥家有两辆车,一辆轿车,一辆箱式货车。

两种车就好比是HTTP协议中的两种方式,我们假设轿车是GET请求方式,箱式货车是POST请求方式。

有一天邓哥想接邓嫂来吃鸡村玩,邓哥准备开箱式货车去接邓嫂。

邓哥要去接邓嫂,就好比程序A要向程序B发出一个请求。从原理上说,无论是轿车还是货车都是车,都能够把人接回来。所以在本质上,GET请求和POST请求都能拉取数据。

这时候,邓哥的父亲(也就是隔壁老王)出来了,说道:“你是不是傻,去接人开轿车多好啊,开货车干嘛?费油不说,没准人家那还不让货车停车呢!”

既然GET和POST都可以做到拉取数据,那么为什么我们通常拉取数据使用GET而不使用POST呢?

在故事中,隔壁老王不让邓哥开卡车去接邓嫂,那么在现实中,是不是也有一个“隔壁老王”这样的角色在限制我们呢?

答案是:有的!这个现实中的“隔壁老王”就是ISO国际标准化组织,这个组织也说了一堆类似隔壁老王的话,这堆话被称为RFC规范。

所以说,我们常说的HTTP协议实际上是基于RFC规范的,实际上GET和POST请求的语法是完全相同的,但是在RFC规范中,给GET请求和POST请求规定了语义,规定GET用来获取信息,POST用来发送信息。

当过年的时候,邓哥想要给邓嫂家送一些年货的时候,邓哥按照隔壁老王的嘱咐,开着货车给邓嫂家送年货去了。当然,送过去了一些蔬菜也会稍微拉回来一点水果~

这就是按照RFC的规范来执行的,当邓哥想要送年货的时候,就会开货车过去;在互联网环境中,如果想要发送信息就要使用POST方法。

POST方法虽然是发送消息的,但也是有Response的,在请求返回的时候带回来一点数据也是被允许的。

那么这时候问题又来了,邓哥如果不听老王的怎么办?那这个规范不就没有作用了吗?这个时候老王也是很有办法的,老王就坐在院子门口,如果邓哥想运货出去的时候,开的不是货车就不让出院门~

光有规范没有具体的软件实施也是没有意义的,所以很多的软件遵从了RFC的规范,比如我们熟悉的Chrome浏览器。所以我们想用GET方式发送文件或者图片是不可能的~就像邓哥不可能用轿车去给邓嫂送年货一样。

所以我们最后来总结一下:

当人们问起GET和POST的区别时,我们要先确定,这里的GET和POST是基于什么前提的?

1. 如果什么前提都没有,也就是不用任何规范限制的话,我们只考虑语法来说,这两个方式是没有任何区别的,只有名字不一样。

2. 如果是基于RFC规范的,那么问题就又来了。是基于RFC理论的,还是基于具体的实现的。

(1)如果是基于RFC理论的,我们称这个为Specification。那么GET和POST是具有相同的语法,但是不具备相同的语义,GET方式用作获取信息,POST方式用作发送信息。

(2)如果是基于RFC的具体实现的,我们称之为implementation。其实要区分是具体的哪一种实现。我们通常默认指的是浏览器实现的RFC。当然不止浏览器,我们任何人都可以设计一个HTTP协议的接口,使用RFC规范,当然这些是我们不用考虑的,因为并不通用。

所以我们只需要考虑浏览器实现的RFC,或者说Web环境下的RFC。这个前提下的答案,就是我们最常见的那些。我就简单的列举在下面了~

a) GET的数据在 URL 中对所有人都是可见的。POST的数据不会显示在 URL 中。

b) GET对数据长度有限制,当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受限制的(URL 的最大长度是 2048 个字符)。POST无限制。

c) GET可收藏为书签,POST不可收藏为书签。

d) GET后退按钮/刷新无影响,POST数据会被重新提交(浏览器应该告知用户数据会被重新提交)。

e) GET编码类型application/x-www-form-url,POST编码类型encodedapplication/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用多重编码。

f) GET历史参数会保留在浏览器历史中。POST参数不会保存在浏览器历史中。

g) GET只允许 ASCII 字符。POST没有限制。也允许二进制数据。

h) 与 POST 相比,GET 的安全性较差,因为所发送的数据是 URL 的一部分。在发送密码或其他敏感信息时绝不要使用 GET !POST 比 GET 更安全,因为参数不会被保存在浏览器历史或 web 服务器日志中。

以上这些点都是我们常见的,还有一些我们不常见的,比如GET请求只会有一次TCP连接,而POST请求会有两次TCP连接。在这背后也有许多的设计和考虑~

所以在我们不要认为GET和POST请求有什么区别是一个很简单的问题哦~很多简单的问题背后都有着很复杂的背景。

//////////

其实这也提醒着我们在学习和生活中不要失去好奇心。就像我们为什么是站在地球上而不是飘在空中?太阳为什么总是东升西落?天空为什么是蓝色的而不是其他颜色?为什么人类都有眼睛鼻子和嘴?

很多我们认为是理所当然的背后都有着它理所当然的道理。也许这个道理就是另一个全新世界的大门~!希望你能够在这个浮躁的世界中保持着一颗纯洁的好奇心~!

如果你是个技术小白,也欢迎你来到我们的讨论群,在这里我们会一起讨论技术相关的问题,俗话说的好,三个臭皮匠赛过诸葛亮嘛,也许多几个人出主意,你的技术难题就被瞬间攻破了呢。在这里我们还会一起分享资源,不论是学习的还是一些面试题啦,还有一些一线互联网公司的招聘信息。

你必须知道的get与post的真正区别的更多相关文章

  1. C#刨根究底:《你必须知道的.NET》读书笔记系列

    一.此书到底何方神圣? <你必须知道的.NET>来自于微软MVP—王涛(网名:AnyTao,博客园大牛之一,其博客地址为:http://anytao.cnblogs.com/)的最新技术心 ...

  2. (转)【推荐】初级.NET程序员,你必须知道的EF知识和经验

    转自:http://www.cnblogs.com/zhaopei/p/5721789.html [推荐]初级.NET程序员,你必须知道的EF知识和经验   阅读目录   [本文已下咒.先顶后看,会涨 ...

  3. 《你必须知道的.NET》读书笔记一:小OO有大智慧

    此篇已收录至<你必须知道的.Net>读书笔记目录贴,点击访问该目录可以获取更多内容. 一.对象  (1)出生:系统首先会在内存中分配一定的存储空间,然后初始化其附加成员,调用构造函数执行初 ...

  4. 《你必须知道的.NET》读书笔记二:小OO有大原则

    此篇已收录至<你必须知道的.Net>读书笔记目录贴,点击访问该目录可以获取更多内容. 一.单一职责原则 (1)核心思想:一个类最好只做一件事,只有一个引起它变化的原因 (2)常用模式:Fa ...

  5. 《你必须知道的.NET》读书笔记三:体验OO之美

    此篇已收录至<你必须知道的.Net>读书笔记目录贴,点击访问该目录可以获取更多内容. 一.依赖也是哲学 (1)本质诠释:“不要调用我们,我们会调用你” (2)依赖和耦合: ①无依赖,无耦合 ...

  6. 《你必须知道的.NET》读书笔记:从Hello World认识IL

    通用的语言基础是.NET运行的基础,当我们对程序运行的结果有异议的时候,如何透过本质看表面,需要我们从底层来入手探索,这时候,IL便是我们必须知道的基础. 一.IL基础概念 1.1 什么是IL? IL ...

  7. MVC中你必须知道的13个扩展点

    MVC中你必须知道的13个扩展点 pasting 转:http://www.cnblogs.com/kirinboy/archive/2009/06/01/13-asp-net-mvc-extensi ...

  8. 前端开发必须知道的JS(二) 闭包及应用

    http://www.cnblogs.com/ljchow/archive/2010/07/06/1768749.html 在前端开发必须知道的JS(一) 原型和继承一文中说过下面写篇闭包,加之最近越 ...

  9. 《你必须知道的.NET》书中对OCP(开放封闭)原则的阐述

    开放封闭原则(OCP,Open Closed Principle)是面向对象原则的核心.由于软件设计本身所追求的墓边就是封装变化,降低耦合,而开放封闭原则就是对这一目标的直接体现.(你必须知道的.NE ...

随机推荐

  1. 最短路 CF954D Fight Against Traffic

    CF954D Fight Against Traffic 题意描述: 给你一张无向图,一共有n个点(2 <= n <= 1000),由m条边连接起来(1 <= m <= 100 ...

  2. HTML-CSS样式表-★★★常用属性★★★及基本概念、分类、选择器

    样式属性 背景与前景: background-color:#F90; /*背景颜色,样式表优先级最高*/ background-image:url(路径); /*设置背景图片(默认)*/ backgr ...

  3. 基于iTop4412的FM收音机系统设计(一)

    说明:第一版架构为:APP+JNI(NDK)+Driver(linux),优点是开发简单,周期短,也作为自己的毕业设计 现在更新第二版,FM服务完全植入Android系统中,成为系统服务,架构为:AP ...

  4. 转-安装vncserver

    怎样在 CentOS 7.0 上安装和配置 VNC 服务器 https://www.linuxidc.com/Linux/2015-04/116725.htm --安装完图形界面和图形管理工具之后,下 ...

  5. oracle 行列转换函数之WM_CONCAT和LISTAGG的使用(一)

    一.wm_concat函数 wm_concat能够实现同样的功能,但是有时在11g中使用需要用to_char()进行转换,否则会出现不兼容现象(WMSYS.WM_CONCAT: 依赖WMSYS 用户, ...

  6. ORACLE INSERT ALL 用法

    1INSERT ALL 1.1句法 multi_table_insert :: = conditional_insert_clause :: = 1.2multi_table_insert 在多表插入 ...

  7. JDBC(4)-Result结果集

    1.Result结果集的引入 当我们查询数据库时,返回的是一个二维的结果集,我们这时候需要使用ResultSet来遍历结果集,获取每一行的数据. 2.使用Result遍历查询结果 boolean ne ...

  8. 【Docker】通过cookie欺骗在ubuntu中使用wget下载jdk

    在ubuntu系统中,如果想通过wget直接下载Orcale内的jdk文件,一般是办不到的.所以就得用特殊的方法. 首先在官网找到自己需要下载的jdk版本下载链接: 点选Accept License ...

  9. c#随便写写 数据层和表现层,队列执行

    base.xxx() 调用父类的方法

  10. 理解C#反射

    参考文章:http://blog.csdn.net/educast/article/details/2894892 上面的文章将C#反射要用到的方法都给出了,下面我将写个例子,帮助理解 [1.使用反射 ...