get 和 post 的区别

HTTP请求报文和响应报文

既然GET和POST是有关HTTP请求的两种方式,就先来看看HTTP请求报文和响应报文的知识。 超文本传输协议(Hypertext Transfer Protocol,简称HTTP)是应用层协议。HTTP 是一种请求/响应式的协议,即一个客户端与服务器建立连接后,向服务器发送一个请求;服务器接到请求后,给予相应的响应信息。

HTTP请求报文

HTTP请求报文由请求行、请求头部、空行和请求体组成,如下图所示:
在这里插入图片描述
请求行

请求行由请求方法、URL、协议版本组成,由空格隔开。常用的HTTP请求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。常用的有GET和POST,就是这篇博文需要区分的两种方式,下面先从HTTP协议的角度做一个简单的说明:

  • GET:当客户端要从服务器端读取某个资源是,使用GET方法。GET方法要求服务器将URL定位的资源放在响应报文的数据部分,回送给客户端,即向服务器请求某个资源。使用GET方法是,请求参数和对应的值附加在URL后面,用?代表URL 的结尾与请求参数的开始,参数之间用&隔开。
  • POST:当客户端给服务器提供信息较多时可以使用POST方法,POST方法向服务器提交数据,比如完成表单数据的提交,将数据提交给服务器处理。GET一般用于获取/查询资源信息,POST会附带用户数据,一般用于更新资源信息。POST 方法将请求参数封装在HTTP 请求数据中,以名称/值的形式出现,可以传输大量数据。
  • HEAD:HEAD跟GET相似,不过服务端接收到HEAD请求时只返回响应头,不发送响应内容。所以,如果只需要查看某个页面的状态时,用HEAD更高效,因为省去了传输页面内容的时间。
  • DELETE:删除某一个资源。
  • OPTIONS:用于获取当前URL所支持的方法。若请求成功,会在HTTP头中包含一个名为“Allow”的头,值是所支持的方法,如“GET, POST”。
  • PUT:把一个资源存放在指定的位置上。
  • TRACE:回显服务器收到的请求,主要用于测试或诊断。
  • CONNECT:CONNECT方法是HTTP/1.1协议预留的,能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接与非加密的HTTP代理服务器的通信。

请求头部

请求头部由关键字/值对组成,关键字和值用英文冒号“:”分隔。请求头部通知服务器有关于客户端请求的信息,典型的请求头有:

  • Accept:客户端可识别的响应内容类型列表:星号 “ * ” 用于按范围将类型分组; “ / ” 指示可接受全部类型;“type/* ”指示可接受type类型的所有子类型;
  • Accept-Language:客户端可接受的自然语言;
  • Accept-Encoding:客户端可接受的编码压缩格式;
  • Accept-Charset:可接受的应答的字符集;
  • Host:请求的主机名,允许多个域名同处一个IP 地址,即虚拟主机;
  • connection:连接方式(close 或 keepalive);
  • Cookie:存储于客户端扩展字段,向同一域名的服务端发送属于该域的cookie;
  • User-Agent:产生请求的浏览器类型;
  • 空行:最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头;

请求体

请求体一般不在GET方法中使用,而是在POST方法中使用(比如提交的表单数据放在请求体中)。与请求体相关的最常使用的请求头是Content-Type和Content-Length;

HTTP响应报文

响应报文由状态行、响应头部、空行和响应体组成,如下图所示:
在这里插入图片描述
状态行

状态行由服务器HTTP协议版本,响应状态码,状态码的文本描述组成。

状态码由3位数字组成,第一个数字定义了响应的类别

  • 1xx:指示信息,表示请求已接收,继续处理
  • 2xx:成功,表示请求已被成功接受并处理。200 OK:客户端请求成功;204 No Content:无内容。服务器成功处理,但未返回内容。一般用在只是客户端向服务器发送信息,而服务器不用向客户端返回什么信息的情况。不会刷新页面。
  • 3xx:重定向。301 Moved Permanently:永久重定向,表示请求的资源已经永久的搬到了其他位置。302 Found:临时重定向,表示请求的资源临时搬到了其他位置。303 See Other:临时重定向,应使用GET定向获取请求资源。303功能与302一样,区别只是303明确客户端应该使用GET访问。
  • 4xx:客户端错误。400 Bad Request:客户端请求有语法错误,服务器无法理解。401 Unauthorized:请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用。403 Forbidden:服务器收到请求,但是拒绝提供服务。404 Not Found:请求资源不存在。比如,输入了错误的url。
  • 5xx:服务器端错误,服务器未能实现合法的请求。500 Internal Server Error:服务器发生不可预期的错误。503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常。

响应包体

服务器返回给客户端的文本信息。

GET和POST的区别

上面说了这么多,可以知道GET和POST就是HTTP协议中请求报文的请求行中标识客户端的两种不同的请求方式。也就是说GET和POST 只是HTTP协议中两种请求方式,而HTTP协议是基于TCP/IP的应用层协议,无论GET还是POST,用的都是同一个传输层协议,所以在传输上没有区别。只是由于HTTP的规定和浏览器/服务器的限制,导致他们在应用过程中体现出了一些不同之处。如果不按规范来也是可以的,可以在URL上写参数,然后方法使用POST;也可以在请求体中写参数,然后方法使用GET。当然,这需要服务端支持。

1. 请求参数存放位置的差异

GET请求的参数是跟着URL后面的,请求行格式为:GET /url?id=1&type=0 HTTP/1.1。POST请求的参数是放在请求体中的。这并不是硬性规定,只是一种规范。

2. 请求参数长度的限制

首先要明确说明,HTTP协议本身对着请求体和URL的长度是没有限制的,对URL限制的大多是浏览器和服务器的原因。

从服务器的角度说,处理长URL要消耗较多的资源,为了性能和安全(防止恶意构造长URL来攻击)考虑,会给URL长度加限制。IE浏览器对URL的最大限制为2083个字符,如果超过这个数字,提交按钮没有任何反应。Firefox浏览器URL的长度限制为65536个字符。Safari URL最大长度限制为80000个字符。Opera URL最大长度限制为190000个字符。Google URL最大长度限制为8182个字符。此外,除了浏览器的限制,还有web服务器的限制,即使用Firefox并不一定能发送长度为65536的URL,而是还收到服务器的限制,若服务器能接受的url长度比65536小,则只能以服务器为准。Apache Server能接受最大url长度为8192个字符。IIS能接受最大url的长度为16384个字符。nginx服务器默认的限制是4K或者8K,这是根据服务器的硬件配置有关的,一般为内存一页的大小,目前大部分为4K,。

3. 安全性和幂等性

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

从HTTP设计规范上看,GET用于信息获取,不对服务器上的资源做修改,POST表示可能修改变服务器上的资源的请求。所谓安全的意味着该操作用于获取信息而非修改信息。当然你也可以将GET用于往数据库中插入一条数据,数据内容放在URL上,你的form表单的提交也可以是GET请求,只是这很不规范。所以GET被认为比POST安全。

由于GET请求参数会暴露在URL中,浏览器页面缓存或者历史记录等会被他人看到,因此隐私数据如密码可能会被泄露。此外,GET请求提交的数据还可能会造成Cross-site request frogery攻击。所以POST被认为比GET安全。

幂等 (idempotent、idempotence)是一个数学或计算机学概念,常见于抽象代数中。
幂等有以下几种定义:
对于单目运算,如果一个运算对于在范围内的所有的一个数多次进行该运算所得的结果和进行一次该运算所得的结果是一样的,那么我们就称该运算是幂等的。 比如绝对值运算就是一个例子,在实数集中,有abs(a) = abs(abs(a)) 。
对于双目运算,则要求当参与运算的两个值是等值的情况下,如果满足运算结果与参与运算的两个值相等,则称该运算幂等,如求两个数的最大值的函数,有在实数集中幂等,即max(x,x) = x 。

但在实际应用中,以上2条规定并没有这么严格。比如新闻站点的头版不断更新。虽然第二次请求会返回不同的一批新闻,该操作仍然被认为是安全的和幂等的,因为它总是返回当前的新闻。

4. 产生的数据包个数
有些文章中提到,post会将header和body分开发送,先发送header,服务端返回100状态码再发送body。
HTTP协议中没有明确说明POST会产生两个TCP数据包,而且实际测试(Chrome)发现,header和body不会分开发送。
但是确实是有发两个包的情况的,可并不是先发post的header,返回一个100继续发送body,而是先发一个tcp包,把header发过去,然后因为nagle算法的原因,就等待一个tcp的ack,然后再发剩下的包。
具体看 https://blog.csdn.net/zerooffdate/article/details/78962818

5. 其他

  • GET请求的页面可以被收藏为书签,POST则相反
  • GET请求会被浏览器主动cache,而POST不会,除非手动设置
  • GET在浏览器回退时是无害的,而POST会再次提交请求
  • GET请求只能进行url编码,而POST支持多种编码方式
  • GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留
  • 对参数的数据类型,GET只接受ASCII字符,而POST没有限制
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值