首先简单介绍一下HTTP协议
HTTP 是超文本传输协议,定义了客户端和服务器之间交换报文的格式和方式,默认使用 80 端口。它使用 TCP 作为传输层协议,保证了数据传输的可靠性。
HTTP 是一个无状态的协议,HTTP 服务器不会保存关于客户的任何信息。
HTTP请求报文
格式如下:
<request-line> //请求行
<headers> //首部行
<blank line> //空行
<request-body> //请求体
HTTP 请求报文的第一行叫做请求行,后面的行叫做首部行,首部行后还可以跟一个请求体(就是参数)。首部行后面有一个空行,不能省略,用于划分首部与实体。
POST请求示例:
POST /woshiuser HTTP/1.1 //请求行
Host: www.woshiuser.com
Content-Type: application/x-www-form-urlencoded
Connection: Keep-Alive
User-agent: Mozilla/5.0. //以上是首部行
(此处必须有一空行) //空行分割header和请求内容
name=eason 请求体
其中,请求行包含三个字段:方法字段、URL 字段和 HTTP 版本字段(如HTTP/1.1)
方法字段可以取几种不同的值,一般有 GET、POST、HEAD、PUT 和 DELETE。一般 GET 方法只被用于向服务器获取数据
POST 方法用于将实体提交到指定的资源,通常会造成服务器资源的修改。HEAD 方法与 GET 方法类似,但是在返回的响应中,不包含请求对象。PUT 方法用于上传文件到服务器,DELETE 方法用于删除服务器上的对象。
那么 GET 请求和 POST 请求的区别到底是什么?
Get 用于请求数据,Post 用于提交数据
- 从应用场景上来说,GET 请求是一个幂等的请求,一般 Get 请求用于对服务器资源不会产生影响的场景,比如说请求一个网页。而 Post 不是一个幂等的请求,一般用于对服务器资源会产生影响的情景。比如注册用户这一类的操作
- 浏览器一般会对 Get 请求缓存,但很少对 Post 请求缓存
- 从发送的报文格式来说,Get 请求的报文中请求体为空。Post 请求的报文中请求体部分一般为向服务器发送的数据
- Get 请求将请求的参数放入 url 中向服务器发送,这种做法相对于 Post 请求来说,不太安全,因为请求的 url 会被保留在历史记录中。并且浏览器由于对 url 有一个长度上的限制(最大是2k),所以会影响 get 请求发送数据时的长度。还有就是 post 的参数传递支持更多的数据类型。
- Get请求的效率一般比POST请求的效率高
PS: 幂等性:就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生副作用