get和post区别

(这篇文章只是本人站在“巨人”肩膀上所做的一些个人总结,仅供参考)
基本上做过WEB开发的,对这个问题,都可以回答出一堆的区别:

  • 最直接的区别,GET请求的参数是放在URL里的,POST请求参数是放在请求body里的;
  • GET请求的URL传参有长度限制,而POST请求没有长度限制;
  • GET请求的参数只能是ASCII码,所以中文需要URL编码,而POST请求传参没有这个限制;等等

个人就认为上述表述并不是十分合理。
get和post其实是HTTP协议中的两种发送请求的方法。
HTTP是什么?HTTP是基于TCP/IP的关于数据如何在万维网中如何通信的应用层协议。
HTTP的底层是TCP/IP。所以GET和POST的底层也是TCP/IP,也就是说,GET/POST都是TCP链接。GET和POST能做的事情是一样一样的。你要给GET加上request body,给POST带上url参数,技术上是完全行的通的。所以上述中的第一点区别并没有太大意义。

HTTP请求,最初设定了以下八种方法。这八种方法本质上没有任何区别。只是让请求,更加有语义而已。

  1. OPTIONS 返回服务器所支持的请求方法
  2. GET 向服务器获取指定资源,具有幂等特性
  3. HEAD 与GET一致,只不过响应体不返回,只返回响应头
  4. POST 向服务器提交(添加)数据,数据放在请求体里
  5. PUT 与POST相似,只是具有幂等特性,一般用于更新
  6. DELETE 删除服务器指定资源,具有幂等特性
  7. TRACE 回显服务器端收到的请求,测试时候会用到这个
  8. CONNECT 预留,暂无使用

当然HTTP协议规范并没有对get的URL传参或者post等请求方式的长度进行限制。那为什么会出现上述上述中的第二点区别呢?
1. Get方法长度限制
其实这个限制是特定的浏览器及服务器对它的限制。
浏览器限制了url的长度。导致get方式参数长度也被限制了!
下面就是对各种浏览器和服务器的最大处理能力做一些说明.
Microsoft Internet Explorer (Browser)
IE浏览器对URL的最大限制为2083个字符,如果超过这个数字,提交按钮没有任何反应。
Firefox (Browser)
对于Firefox浏览器URL的长度限制为65,536个字符。
Safari (Browser)
URL最大长度限制为 80,000个字符。
Opera (Browser)
URL最大长度限制为190,000个字符。
Google (chrome)
URL最大长度限制为8182个字符。
Apache (Server)
能接受最大url长度为8,192个字符。
Microsoft Internet Information Server(IIS)
能接受最大url的长度为16,384个字符。
通过上面的数据可知,为了让所有的用户都能正常浏览, URL最好不要超过IE的最大长度限制(2083个字符),当然,如果URL不直接提供给用户,而是提供给程序调用,这时的长度就只受Web服务器影响了。

注:对于中文的传递,最终会为urlencode后的编码形式进行传递,如果浏览器的编码为UTF8的话,一个汉字最终编码后的字符长度为9个字符。
因此如果使用的 GET 方法,最大长度等于URL最大长度减去实际路径中的字符数。
这里还需注意,不同中文浏览器的编码不同,有的是UTF8,而有的是GBK,这就解释了使用get方式请求会出现中文乱码的情况,这就需要在js中先按照所需编码方式编码,在进行请求(不用浏览器编码,我们按照需求自行编码)。
2. POST方法长度限制
理论上讲,HTTP协议规范也没有对POST进行大小限制,起限制作用的是服务器的处理程序的处理能力。
如:在Tomcat下取消POST大小的限制(Tomcat默认2M);
打开tomcat目录下的conf目录,打开server.xml 文件,向Connector标签中添加maxPostSize=“0” (设为0是取消POST的大小限制) 即可取消POST大小的限制。
幂等性
同时还有人说get方式是幂等性的,而post非幂等性,那么我们了解一下什么是幂等性。
HTTP/1.1中对幂等性的定义是:一次和多次请求某一个资源对于资源本身应该具有同样的结果(网络超时等问题除外)。也就是说,其任意多次执行对资源本身所产生的影响均与一次执行的影响相同。
这里需要关注几个重点:

  1. 幂等不仅仅只是一次(或多次)请求对资源没有副作用(比如查询数据库操作,没有增删改,因此没有对数据库有任何影响)。
  2. 幂等还包括第一次请求的时候对资源产生了副作用,但是以后的多次请求都不会再对资源产生副作用。
  3. 幂等关注的是以后的多次请求是否对资源产生的副作用,而不关注结果。
  4. 网络超时等问题,不是幂等的讨论范围。

幂等性是系统服务对外一种承诺(而不是实现),承诺只要调用接口成功,外部多次调用对系统的影响是一致的。声明为幂等的服务会认为外部调用失败是常态,并且失败之后必然会有重试。
在上面HTTP请求规范中我们看到 GET 向服务器获取指定资源,所以按照规范来说GET方式只用来查询,对系统不会有什么影响(没有做增删改),所以是幂等性的。但是在实际开发中,我们可能使用get方式去进行增删改的操作,其实是不符合http规范的。
RESTful API
顺便介绍一下RESTful API。
服务端根据不同的请求方式,可以做不同的处理,同时,根据不同的请求,还可以设计出不同风格的应用程序接口,这就引出了Representational State Transfer,英文缩写就是REST,中文意思是表述性状态转移(和没翻译差不多),可以理解为客户端和服务端的交互形式。而符合这种交互形式的接口设计,就被叫做RESTful API。这种风格有如下特点:

1.使用名词而不使用动词
例如:/getStudent 或者 /searchStudents 应该改成 /students
GET用于查询,PUT、POST、DELETE用于修改
2. 使用名词复数不使用单数
3. 在HTTP请求的head体里定义序列化类型
例如:Content-Type:application/json
4. 请求的集合应设定好过滤条件、排序、字段、分页
例如:/students?page=1&size=10
5. 接口要版本化
例如:/api/v1/students
6. 要有HTTP状态码
7. 允许重写HTTP请求方法

常用HTTP状态码
` HTTP协议中提供了好多状态码,列举我们常用的:
200 返回正常
304 服务端资源无变化,可使用缓存资源
400 请求参数不合法
401 未认证
403 服务端禁止访问该资源
404 服务端未找到该资源
500 服务端异常

GET和POST还有一个重大区别,简单的说:
GET产生一个TCP数据包;POST产生两个TCP数据包。

对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
因为POST需要两步,时间上消耗的要多一点,看起来GET比POST更有效。因此Yahoo团队有推荐用GET替换POST来优化网站性能。但这是一个坑!跳入需谨慎。为什么?

  1. GET与POST都有自己的语义,不能随便混用。
  2. 据研究,在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视。而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点。
  3. 并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。

所以说语义不同才是get和post的根本不同点

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值