HTTP中GET与POST的区别 99%的错误认识

本篇文章分两部分,第一部分可以列为初为新人的装逼失败模式,第二部分列为修炼低调模式。
装逼失败模式:99%的人对GET和POST的认识
修炼低调模式:1%不知道的进阶认识

GET和POST,在我们日常WEB开发中,是最常用的数据传输方式。面试中我们也经常会遇到。
一般我们在浏览器输入一个网址URL访问网站都是GET方式请求;
在HTML FROM表单中,可以通过设置method指定提交方式为GET或者POST方式,默认为GET提交方式

HTTP定义了与服务器交互的不同方法,其中最基本的四种:GET,POST,PUT,DELETE,HEAD;
其中GET和HEAD被称为安全方法,因为使用GET和HEAD的HTTP请求不会产生什么动作。不会产生动作意味着GET和HEAD的HTTP请求不会在服务器上产生任何结果。但是安全方法并不是什么动作都不产生,这里的安全方法仅指不会修改信息。

GET和POST我们比较常用,其它几种实际应用比较少用到,在此仅作了解。


99%的人所认为的GET和POST

1. 传输方式(自我理解“显示方式”)

GET请求的数据会附加在URL之后,以?分割URL和传输数据,多个参数之间以&连接,
"http://www.xxx.com/product?type=shoe&price=100&sex=male"
数据格式有以下注意点:

  1. 如果数据是英文字母/数字,原样发送;
  2. 如果是空格,转换为+;
  3. 如果是中文或其他字符,则把数据用Base64加密,
    "%E4%BD%A0%E5%A5%BD"其中%XX中的XX为该符号以16进制表示的ASCII码。

POST请求会把请求的数据放置在HTTP请求包的包体中,GET传输的数据会直接暴露在URL中,而POST请求则不会。

2. 传输数据大小

GET方式传输的数据最多只能是1024字节,
因为GET是通过URL提交数据,那么GET可提交的数据量就跟URL的长度有直接关系,URL本身不存在参数上限的问题,HTTP协议规范也没有对URL长度进行限制。
这个限制是特定的浏览器及服务器对它的限制。IE对URL长度的限制是2083字节(2K+35)。对于其他浏览器,如Netscape、FireFox等,理论上没有长度限制,其限制取决于操作系统的支持。

注意:限制是针对整个URL长度,不单是传输的数据长度。

POST方式理论上没有限制,可传较大的数据。起限制作用的是服务器的处理程序的处理能力。Apache, Nigx, IIS服务器自身可配置限制传输大小。

3. GET在浏览器回退是无害的,而POST会再次提交请求

4. GET产生的URL可以作为标签或存于历史记录中,而POST不可以

5. GET请求会被浏览器主动cahe,而POST不会,除非手动设置

6. 安全性

GET传输的数据直接暴露在URL中,如果我们在做用户登录时,需要传输登录帐号及密码到后端做验证,如果用GET方式,那么账户密码直接暴露在URL里面,是极其危险的。
而且浏览器缓存的机制,访问过的网站URL会被保存在浏览器历史记录里,其他人可通过历史记录查看访问网站URL,直接获取到传输的数据。
很可能受到 "Cross-site request forgery"(中文名称:跨站请求伪造) 攻击。
不过POST的数据也是可以被拦截的。

总结:

  1. GET请求是用来向服务器发送索取数据的一种请求,实际应用中数据不涉及到安全性,可用GET方式来向后端请求数据,
    如分页或搜索关键词 "http://www.xxx.com/product?keywords=xxx&page=2";
  2. POST请求是向服务器提交数据的一种请求,涉及到安全性的数据,用POST的方式来传输较GET更安全。


曾经的曾经,我也是那99%的一员,还把自己归纳的文章发给新人同事看,然后装逼失败,被老大引导练成最后的这1%。


1%的人所拥有的

GET和POST本质上是没有区别的,它们是HTTP协议中的两种发送请求的方式。
HTTP是基于TCP/IP的关于数据如何在万维网中通信的协议,即HTTP的底层是TCP/IP,所以GET和POST的底层也是TCP/IP,也就是说:GET/POST都是TCP链接。
给POST带上url参数,给GET加上request body,技术上是可以实现的。

为了更方便的管理,避免混乱,HTTP给这些请求定义GET,POST,PUT,DELETE。
而数据大小,则是因为浏览器的限制造成的。

所以GET和POST本质上就是TCP链接,并无差别。但是由于HTTP的规定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同

隐藏的Buff

GET产生一个TCP数据包,而POST产生两个TCP数据包

GET的请求,浏览器会把http header和data一并发送出去,服务器返回200(返回数据)
POST的请求,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200(返回数据)

因为POST需要两步,时间上消耗的多一点,
不过网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视。
网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点

并不是所有浏览器POST发送两次包,Fiefox就发送一次。

最后的最后,当你以后被别人问到的时候,你就可以。。。。。。请开始你的表演

参考文章:《99%的人都理解错了HTTP中GET与POST的区别》

原文地址:https://www.cnblogs.com/baimeishaoxia/p/12213121.html

时间: 2024-11-04 10:28:58

HTTP中GET与POST的区别 99%的错误认识的相关文章

.Net中堆栈和堆的区别

多线程在笔试面试中经常出现,下面列出一些公司的多线程笔试面试题.首先是一些概念性的问答题,这些是多线程的基础知识,经常出现在面试中的第一轮面试(我参加2011年腾讯研究院实习生招聘时就被问到了几个概念性题目).然后是一些选择题,这些一般在笔试时出现,虽然不是太难,但如果在选择题上花费大多时间无疑会对后面的编程题造成影响,因此必须迅速的解决掉.最后是综合题即难一些的问答题或是编程题.这种题目当然是最难解决了,要么会引来面试官的追问,要么就很容易考虑不周全,因此解决这类题目时一定要考虑全面和细致.

Visual Studio中的Build和Rebuild区别

Visual Studio中的Build和Rebuild区别 一般来说Rebuild=99%*(Clean+Build),效果在非常小的可能性下会不同,一般可以忽略.Rebuild是对Solution下的所有项目,逐个进行 Clean+Build.不论文件更改与否Clean+Build是对选中的项目(如果选中Solution的话,全部Clean之后,再全部Build)先执行Clean再执行Build.一般不需要执行Clean.Build只是针对有更改过的文件进行编译.而Rebuild会编译所有.

oracle中union和union all区别与性能分析

[ 概要 ] 经常写sql的同学可能会用到union和union all这两个关键词, 可能你知道使用它们可以将两个查询的结果集进行合并, 那么二者有什么区别呢? 下面我们就简单的分析下. [ 比较 ] union: 对两个结果集进行并集操作, 不包括重复行,相当于distinct, 同时进行默认规则的排序; union all: 对两个结果集进行并集操作, 包括重复行, 即所有的结果全部显示, 不管是不是重复; 下面我们举一个简单的例子来证明上面的结论: 1. 准备数据: drop table

用count(*)还是count(列名) || Mysql中的count()与sum()区别

Mysql中的count()与sum()区别 首先创建个表说明问题 CREATE TABLE `result` ( `name` varchar(20) default NULL, `subject` varchar(20) default NULL, `score` tinyint(4) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8 插入一些数据, insert into result values ('张三','数学',90), ('张三

【翻译】JAVA中抽象类和接口的区别

不知道有没有人翻译过了,这篇是挺简单的,权当复习一遍内容吧. 很多常见的面试问题如"抽象类和接口有什么区别","你在什么时候用抽象类什么时候用接口".所以在这篇文章里面,我们会讨论一下这个话题. 在开始讨论它们的区别之前,我们先看看它们的介绍. Abstract class 抽象类 抽象类被用来抽象出子类的共同特征.它是不能被实例化的,它只能被子类继承作为超类使用.抽象类被用作它的子类下的层次结构创建模板(Abstract classes are used to c

lua中的pairs和ipairs区别

pairs Returns three values: the next function, the table t, and nil, so that the construction for k,v in pairs(t) do body end will iterate over all key–value pairs of table t. See function next for the caveats of modifying the table during its traver

浅谈HTTP中Get与Post的区别_转

可参考:HTTP请求中POST与GET的区别 Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE.URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查,改,增,删4个操作.到这里,大家应该有个大概的了解了,GET一般用于获取/查询资源信息,而POST一般用于更新资源信息. 1.根据HTTP规范,GET用于信息获取,而且应该是安全的和幂等的

python类中super()和__init__()的区别

本文和大家分享的主要是python开发中super()和__init__()的区别,希望通过本文的分享,对初学者学习这部分内容有所帮助. 1.单继承时super()和__init__()实现的功能是类似的 class Base(object): def __init__(self): print 'Base create' class childA(Base): def __init__(self): print 'creat A ', Base.__init__(self) class chi

PHP中this,self,parent的区别

{一}PHP中this,self,parent的区别之一this篇 面向对象编程(OOP,Object OrientedProgramming)现已经成为编程人员的一项基本技能.利用OOP的思想进行PHP的高级编程,对于提高PHP编程能力和规划web开发构架都是很有意义的. PHP5经过重写后,对OOP的支持额有了很大的飞跃,成为了具备了大部分面向对象语言的特性的语言,比PHP4有了很多的面向对象的特性.这里我主要谈的是this,self,parent 三个关键字之间的区别.从字面上来理解,分别