深入【Get】与【Post】区别

简介: 深入【Get】与【Post】区别

区别:


GET请求在URL中传送的参数是有长度限制的,而POST没有。


GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。而POST数据不会显示在URL中。是放在Request body中。


对参数的数据类型,GET只接受ASCII字符,而POST没有限制。


GET请求参数会被完整保留在浏览器历史记录里;相反,POST请求参数也不会被浏览器保留。


GET请求只能进行url编码(application/x-www-form-urlencoded),而POST支持多种编码方式。


GET请求会被浏览器主动缓存,而POST不会,除非手动设置。


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


其实吧,GET和POST在本质上没有区别,都是HTTP协议中的两种发送请求的方法。而HTTP呢,是基于TCP/IP的关于数据如何在万维网中如何通信的协议。


万维网:简称WWW,是World Wide Web的简称,也称为Web、3W等。


HTTP的底层是TCP/IP。所以GET和POST的底层也是TCP/IP,也就是说,GET/POST都是TCP链接。


GET和POST能做的事情是一样一样的。你要给GET加上request body,给POST带上url参数,技术上是完全行的通的。


举个例子吧:


TCP就像汽车,我们用TCP来运输数据,它很可靠,从来不会发生丢件少件的现象。


但是如果路上跑的全是看起来一模一样的汽车,那这个世界看起来是一团混乱,送急件的汽车可能被前面满载货物的汽车拦堵在路上,整个交通系统一定会瘫痪。


为了避免这种情况发生,交通规则HTTP诞生了。HTTP给汽车运输设定了好几个服务类别,包括GET, POST, PUT等等,


HTTP规定,当执行GET请求的时候,要给汽车贴上GET的标签(设置method为GET),而且要求把传送的数据放在车顶上(url中)以方便记录。


如果是POST请求,就要在车上贴上POST的标签,并把货物放在车厢里(request body中)。

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


URL中传送参数的长度限制在Get和Post中都是怎么样的呢?


不同的浏览器Client端(发起http请求)和服务器server端(接受http请求)就是不同的运输公司。


虽然理论上,你可以在车顶上无限的堆货物(url中无限加参数)。但是运输公司可不傻,装货和卸货也是有很大成本的,他们会限制单次运输量来控制风险,数据量太大对浏览器和服务器都是很大负担。


业界不成文的规定是,(大多数)浏览器通常都会限制url长度在2K个字节,而(大多数)服务器最多处理64K大小的url。


超过的部分,恕不处理。如果你用GET服务,在request body偷偷藏了数据,不同服务器的处理方式也是不同的,有些服务器会帮你卸货,读出数据,有些服务器直接忽略。



那GET 方法参数写法是固定的吗?

在约定中,我们的参数是写在 ? 后面,用 & 分割。如下:


http://ip:port/project/getUserInfo?username=chenhhaha&age=26&sex=2



我们知道,解析报文的过程是通过获取 TCP 数据,用正则等工具从数据中获取 Header 和 Body,从而提取参数。


比如header请求头中添加token,来验证用户是否登录等权限问题。


也就是说,我们可以自己约定参数的写法,只要服务端能够解释出来就行,万变不离其宗。


那么说来,是不是POST 方法比 GET 方法更安全呢?

有人说POST 比 GET 安全,因为数据在地址栏上不可见。


然而,从传输的角度来说,他们都是不安全的,因为 HTTP 在网络上是明文传输的,只要在网络节点上捉包,就能完整地获取数据报文。


其实,要想安全传输,就只有加密,也就是 HTTPS。


你知道Get、Post请求发送的数据包有什么不同吗?

GET请求时产生一个TCP数据包;POST请求时产生两个TCP数据包。


GET:浏览器会把http header和data一并发送出去,服务器响应200(返回数据);

POST:浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 OK(返回数据)。


POST需要两步,理论上时间上消耗的要多一点,看起来GET比POST更有效。但并不是,后来发现原来是个坑。在我看来:



GET与POST都有自己的语义,不能随便混用。


据研究,在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视。而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点。


并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。我去年用Chrome浏览器测试发现也是只发送一次,所以我认为Get、POST性能差可以人为忽略。


相关文章
|
7月前
|
网络协议 数据安全/隐私保护
get和post的区别
get和post的区别
65 0
|
25天前
|
XML 缓存 安全
PUT 请求和 POST 请求有什么区别?
【10月更文挑战第25天】PUT请求和POST请求在HTTP协议中有着不同的功能和应用场景,开发者需要根据具体的业务需求和资源操作的性质来选择合适的请求方法,以确保客户端与服务器之间的交互准确、安全且符合预期。
|
7月前
|
Web App开发 缓存 网络协议
get和post的区别!
get和post的区别!
|
7月前
|
缓存 安全 数据安全/隐私保护
get 跟 post 有什么区别?
get 跟 post 有什么区别?
86 0
get和post的区别
`GET` 和 `POST` 是 HTTP 请求方法,常用于客户端(如浏览器)与服务器之间的通信。
|
7月前
|
缓存 安全 数据安全/隐私保护
GET和POST有什么区别
GET和POST有什么区别
|
网络协议 安全 数据安全/隐私保护
GET与POST的区别
GET与POST的区别
143 0
|
Web App开发 网络协议 安全
GET和POST两种基本请求方法的区别
GET和POST两种基本请求方法的区别
|
缓存 安全 网络协议
PUT和POST的区别
PUT 和 POST 是 HTTP 协议中两种常用的请求方法。它们有些相似之处,但也有一些重要的区别。在本文中,我们将详细介绍 PUT 和 POST 的区别。
|
缓存 安全 前端开发
GET和POST有什么区别?
GET和POST有什么区别?
GET和POST有什么区别?