HTTP协议中GET和POST的区别

本文详细探讨了HTTP协议中GET和POST方法的区别,包括它们在实际应用中的限制、安全性考量及HTTP规范下的行为差异。同时,分析了GET与POST在速度、缓存和管道化传输方面的表现。

(一)、不完全正确的网红答案

  1. GET的URL会有长度上的限制,则POST的数据则能非常大。

  2. POST比GET安全,ET请求的数据会附在URL之后,POST把提交的数据则放置在是HTTP包的包体中。

(二)、为什么是不完全正确的答案

  1. HTTP协议对GET和POST都没有对长度的限制:HTTP协议没有对传输的数据大小进行限制,HTTP协议规范也没有对URL长度进行限制。

    而在实际开发中存在的限制主要有:

    GET:特定浏览器和服务器对URL长度有限制,例如 IE对URL长度的限制是2083字节(2K+35)。对于其余浏览器,如Netscape、FireFox等,理论上没有长度限制,其限制取决于操作系 统的支持。因而对于GET提交时,传输数据就会受到URL长度的 限制。

    POST:因为不是通过URL传值,理论上数据不受 限。但实际各个WEB服务器会规定对post提交数据大小进行限制,Apache、IIS6都有各自的配置。

  1. 安全性意义不同:通过GET提交数据,使用户名和密码将明文出现在URL上,由于登录页面有可可以被浏览器缓存,其余人查看浏览器的历史纪录,那么别人即可以拿到你的账号和密码了。post一般来说都不会被缓存,但有很多抓包工具也是能窥探到你的数据,真的要安全那就要把传输的信息加密。但这不是HTTP协议对get和post做的的安全性区别,是浏览器用的具体体现出来的。get在HTPP协议中使用于获取数据,post在在HTTP协议中使用于修改数据。

(三)、在HTTP中get和post的原理区别

Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE
URL全称是资源形容符,我们能这样认为:一个URL地址,它使用于形容一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查 ,改 ,增 ,删 4个操作。到这里,大家应该有个大概的理解了,GET一般使用于获取/查询资源信息,而POST一般使用于升级资源信息

根据HTTP规范,GET使用于信息获取,而且应该是安全的和幂等的。

  1. 所谓安全的意味着该操作使用于获取信息而非修改信息。换句话说,GET请求一般不应产生反作用。就是说,它仅仅是获取资源信息,就像数据库查询一样,不会修改,添加数据,不会影响资源的状态。
    注意:这里安全的含义仅仅是指是非修改信息。

  2. 幂等的意味着对同一URL的多个请求应该返回同样的结果。幂等(idempotent、idempotence)是一个数学或者计算机学概念,常见于笼统代数中。
    幂等有以下几种定义:
    对于单目运算,假如一个运算对于在范围内的所有的一个数屡次进行该运算所得的结果和进行一次该运算所得的结果是一样的,那么我们就称该运算是幂等的。 比方绝对值运算就是一个例子,在实数集中,有abs(a) = abs(abs(a)) 。
    对于双目运算,则要求当参加运算的两个值是等值的情况下,假如满足运算结果与参加运算的两个值相等,则称该运算幂等,如求两个数的最大值的函数,有在实数集中幂等,即max(x,x) = x 。看完上述解释后,应该能了解GET幂等的含义了。

  • 但在实际应使用中,以上2条规定并没有这么严格。引使用别人文章的例子:比方,新闻站点的头版不断升级。尽管第二次请求会返回不同的一批新闻,该操作依然被认为是安全的和幂等的,由于它总是返回当前的新闻。从根本上说,假如目标是当使用户打开一个链接时,他能确信从自身的角度来看没有改变资源就可。

  • 根据HTTP规范,POST表示可可以修改变服务器上的资源的请求。继续引使用上面的例子:还是新闻以网站为例,读者对新闻发表自己的评论应该通过POST实现,由于在评论提交后站点的资源已经不同了,或者者说资源被修改了。

上面大概说了一下HTTP规范中,GET和POST的少量原理性的问题。但在实际的做的时候,很多人却没有按照HTTP规范去做,导致这个问题的起因有很多,比方说:

  1. 很多人贪方便,升级资源时使用了GET,由于使用POST必需要到FORM(表单),这样会麻烦一点。

  2. 对资源的增,删,改,查操作,其实都能通过GET/POST完成,不需要使用到PUT和DELETE。

  3. 另外一个是,早期的但是Web MVC框架设计者们并没有有意识地将URL当作笼统的资源来看待和设计。还有一个较为严重的问题是传统的Web MVC框架基本上都只支持GET和POST两种HTTP方法,而不支持PUT和DELETE方法。

(四)、既然post有这么多优点,那我们为什么要用get?

答案就是:由于get比post更快。

(一)、post请求的过程,会先将请求头发送给服务器进行确认,而后才真正发送数据;而get请求的过程,会在连接建立后会将请求头和请求数据一起发送。

post请求的过程

  1. 浏览器请求tcp连接(第一次握手)

  2. 服务器答应进行tcp连接(第二次握手)

  3. 浏览器确认,并发送post请求头(第三次握手,这个报文比较小,所以http会在此时进行第一次数据发送)

  4. 服务器返回100 continue响应

  5. 浏览器开始发送数据

  6. 服务器返回200 ok响应

get请求的过程

  1. 浏览器请求tcp连接(第一次握手)

  2. 服务器答应进行tcp连接(第二次握手)

  3. 浏览器确认,并发送get请求头和数据(第三次握手,这个报文比较小,所以http会在此时进行第一次数据发送)

  4. 服务器返回200 ok响应

也就是说,目测get的总耗是post的2/3左右

(二)、get会将数据缓存起来,而post不会

  • 能做个简短的测试,用ajax采使用get方式请求静态数据(比方html页面,图片)的时候,假如两次传输的数据相同,第二次以后消耗的时间将在10ms以内(chrome测试),而post每次消耗的时间都差不多。经测试,chrome下和firefox下假如检测到get请求的是静态资源,则会缓存,假如是数据,则不缓存,但是IE这个傻X啥都会缓存起来

(三)、post不可以进行管道化传输

  • http在的一次会话需要先建立tcp连接而后才可以通信,假如每次连接都只进行一次http会话,那这个连接过程占的比例太大了!

  • 于是出现了持久连接:在http/1.0+中是connection首部中增加keep-alive值,在http/1.1中是在connection首部中增加persistent值,当然两者不仅仅是命名上的差别,http/1.1中,持久连接是默认的,除非显示在connection中增加close,否则持久连接不会关闭,而http/1.0+中则刚好相反,除非显示在connection首部中增加keep-alive,否则在接收数据包后连接就断开了。

  • 出现了持久连接还不够,在http/1.1中,还有一种称为管道通信的方式进行速度优化:把需要发送到服务器上的所有请求放到输出队列中,在第一个请求发送出去后,不等到收到服务器的应答,第二个请求紧接着就发送出去,但是这样的方式有一个问题:不安全,假如一个管道中有10个连接,在发送出9个后,忽然服务器告诉你,连接关闭了,此时用户端即便收到了前9个请求的回答,也会将这9个请求的内容清空,也就是说,白忙活了……此时,用户端的这9个请求需要重新发送。这对于幂等请求还好(比方get,多发送几次都没关系,每次都是相同的结果),假如是post这样的非幂等请求(比方支付的时候,多发送几次就惨了),一定是行不通的。所以,post请求不可以通过管道的方式进行通信!

管道化传输在浏览器端的实现还需考证,貌似默认情况下大部分浏览器(除了opera)是不进行管道化传输的,除非手动开启!!

所以,在能用get请求通信的时候,不要用post请求,这样使用户体验会更好,当然,假如有安全性要求的话,post会更好。

 

注:转载https://yiweifen.com/v-1-393644.html

转载于:https://www.cnblogs.com/Liu-yz/p/9708695.html

<think> 嗯,用户明确询问HTTP协议POSTGET请求的区别,这个问题看似基础但实际暗藏玄机。用户提供的5个引用材料存在矛盾点(比如引用[1][3]强调URL长度限制而引用[2]指出协议本身无限制),需要帮用户厘清技术规范实现约束的区别。 从引用[1]提到的"别人想要的答案"来看,用户可能厌倦了网上泛泛而谈的对比,需要更本质的分析。引用[2]关于协议标准的说明很有价值,应该重点展开。同时要考虑用户身份——能提出这种问题大概率是开发者,需要补充实际编程中的注意点(如引用[4]的AJAX示例就很实用)。 梳理三个维度来组织回答:协议规范(RFC定义)、实现现状(浏览器/服务器限制)、开发实践(安全性/幂等性)。特别注意几个关键点: - 幂等性:引用[3]提到POST用于数据修改,这本质是幂等性差异,需用$RFC2616$规范说明 - 编码类型:引用[5]的请求头字段需要关联到Content-Type的差异 - 安全性误区:引用[1][3]都提到安全性,但要强调"HTTPS才是安全核心"这个本质 最后生成的问题要引导用户深入思考:第1题针对缓存特性(引用[5]的Accept字段引申),第2题聚焦文件上传这种POST特有场景(虽然引用都没提但很重要),第3题则指向RESTful架构这种实际应用。 </think> HTTP协议POSTGET请求的核心区别体现在以下几个方面: ### 一、语义与设计目的 1. **GET** - 语义:**获取资源**(安全且幂等)[^1][^3] > 同一请求多次执行结果相同,不应改变服务器状态 - 典型场景:搜索、分页、资源查询 2. **POST** - 语义:**提交数据并处理**(非幂等)[^1][^3] > 每次请求可能产生新资源或修改状态(如订单提交) - 典型场景:表单提交、文件上传、数据更新 ### 二、技术实现差异 | 特性 | GET | POST | |--------------|------------------------------|------------------------------| | **数据位置** | URL参数(`?key=value`)[^1] | HTTP Body(通过实体传输)[^1] | | **数据可见性** | 暴露在URL、浏览器历史[^1][^3] | 不在URL中,相对隐蔽[^3] | | **长度限制** | 协议无限制,但浏览器/服务器实现有限制(通常2KB-8KB)[^2][^4] | 协议无限制,取决于服务器配置 | | **编码类型** | 仅`application/x-www-form-urlencoded` | 支持多种编码(如`multipart/form-data`)[^1] | | **缓存特性** | 可被缓存、书签保存[^1] | 默认不被缓存[^3] | | **安全性** | 参数明文传输(需HTTPS加密) | 相对隐蔽(仍需HTTPS保证安全)[^3] | ### 三、关键误区澄清 1. **长度限制** HTTP协议**未规定**GET的URL长度,限制来源于: - 浏览器约束(Chrome~8KB,IE~2KB)[^4] - 服务器配置(如Apache的`LimitRequestLine`)[^2] 2. **安全性差异** POST不自动加密数据!安全性**完全依赖HTTPS**,二者在明文传输时均不安全[^1][^3]。 3. **执行速度** GET可能更快仅因: - 无Body传输开销 - 可利用缓存减少请求 网络层性能无本质差异[^3]。 ### 四、开发实践建议 ```javascript // GET请求示例(参数暴露) fetch('/api/data?id=123') // POST请求示例(数据封装) fetch('/api/submit', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ user: 'Alice' }) // 数据在Body中 }) ``` > 遵循RESTful规范:GET用于读,POST/PUT用于写[^1][^3] ### 五、本质区别总结 > **核心差异是语义而非技术**:GET是"我要获取数据",POST是"请处理这些数据"[^1]。技术实现(如数据位置、缓存)是为语义目标服务的衍生特性。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值