一、概念
客户端与服务端通信时传输的内容我们称之为报文。HTTP协议就是规定报文的格式。HTTP就是一个通信规则,这个规则规定了客户端发送给服务器的报文格式,也规定了服务器发送给客户端的报文格式。实际我们要学习的就是这两种报文。客户端发送给服务器的称为"请求报文",服务器发送给客户端的称为"响应报文"。
浏览器和服务器是按照HTTP协议进行数据通信的。
刚才提到HTTP协议是规定了请求和响应数据的格式,那具体的格式是什么呢?
HTTP协议又分为:请求协议和响应协议
- 请求协议:浏览器将数据以请求格式发送到服务器
- 包括:请求行、请求头 、请求体
- 响应协议:服务器将数据以响应格式返回给浏览器
- 包括:响应行 、响应头 、响应体
二、请求方式
在HTTP1.1版本中,浏览器访问服务器的几种方式:
请求方式 | 请求说明 |
---|---|
GET | 获取资源。 向特定的资源发出请求。例:http://www.baidu.com/s?wd=itheima |
POST | 传输实体主体。 向指定资源提交数据进行处理请求(例:上传文件),数据被包含在请求体中。 |
OPTIONS | 返回服务器针对特定资源所支持的HTTP请求方式。 因为并不是所有的服务器都支持规定的方法,为了安全有些服务器可能会禁止掉一些方法,例如:DELETE、PUT等。那么OPTIONS就是用来询问服务器支持的方法。 |
HEAD | 获得报文首部。 HEAD方法类似GET方法,但是不同的是HEAD方法不要求返回数据。通常用于确认URI的有效性及资源更新时间等。 |
PUT | 传输文件。 PUT方法用来传输文件。类似FTP协议,文件内容包含在请求报文的实体中,然后请求保存到URL指定的服务器位置。 |
DELETE | 删除文件。 请求服务器删除Request-URI所标识的资源 |
TRACE | 追踪路径。 回显服务器收到的请求,主要用于测试或诊断 |
CONNECT | 要求用隧道协议连接代理。 HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器 |
在我们实际应用中常用的也就是 :GET、POST
三、GET方式的请求协议
1)请求行
HTTP请求中的第一行数据。由:请求方式
、资源路径
、协议以及协议的版本
组成(之间使用空格分隔)
HTTP有两个版本:1.0和1.1,我们使用一般都是1.1版本
- 请求方式:GET
- 资源路径:
/brand/findAll?name=OPPO&status=1
- 请求路径:
/brand/findAll
- 请求参数:
name=OPPO&status=1
- 请求参数是以key=value形式出现
- 多个请求参数之间使用
&
连接
- 请求路径和请求参数之间使用
?
连接
- 请求路径:
- 协议/版本:
HTTP/1.1
2)请求头
第二行开始,上图黄色部分内容就是请求头。格式为key: value形式
- http是个无状态的协议,所以在请求头设置浏览器的一些自身信息和想要响应的形式。这样服务器在收到信息后,就可以知道是谁,想干什么了
常见的HTTP请求头有:
- 表示请求的主机名
Host: localhost:8080
- 浏览器版本。 例如:Chrome浏览器的标识类似Mozilla/5.0 ...Chrome/79 ,IE浏览器的标识类似Mozilla/5.0 (Windows NT ...)like Gecko
一般用于浏览器的兼容器处理,不同的浏览器它们的内核是有差异的,这就造成了,同一段程序在不同的浏览器解析出来的效果是不一样的,这个我们称之为浏览器的兼容性问题。
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36
- 表示浏览器能接收的资源类型【媒体类型,官网称呼:MIME】,如text/*(希望接受的是一个文本),image/*或者*/*表示所有;
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
- 表示浏览器偏好的语言,服务器可以据此返回不同语言的网页
Accept-Language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7
- 表示浏览器可以支持的压缩类型,例如gzip, deflate等
Accept-Encoding: gzip, deflate, br
Content-Type: 请求主体的数据类型
Content-Length: 数据主体的大小(单位:字节)
- 表示支持长连接
Connection: keep-alive
- 请求协议的自动升级[我们发送请求的时候可能用的是http协议,服务器却是https协议,加上这个头后,浏览器自动会将请求协议升级为https的]
Upgrade-Insecure-Requests: 1
- 当前页面的上一个页面的路径[当前页面通过哪个页面跳转过来的]:可以通过此路径跳转回上一个页面,广告计费,防止盗链
Referer: http://localhost:8080/05_web_tomcat/login.html
举例说明:服务端可以根据请求头中的内容来获取客户端的相关信息,有了这些信息服务端就可以处理不同的业务需求。
比如:
- 不同浏览器解析HTML和CSS标签的结果会有不一致,所以就会导致相同的代码在不同的浏览器会出现不同的效果
- 服务端根据客户端请求头中的数据获取到客户端的浏览器类型,就可以根据不同的浏览器设置不同的代码来达到一致的效果(这就是我们常说的浏览器兼容问题)
3)请求体
存储请求参数
-
GET请求的请求参数在请求行中,故不需要设置请求体,但是有一个
queryString
(查询字符串,紧跟在URL后面的) -
post方式:有请求体,称之为
form data
-
json格式:有请求体,
request payload
-
请求体和请求头是有一个空行存在的,通过一个空行将这两部分分离开来
四、POST方式的请求协议
- 请求行(以上图中红色部分):包含请求方式、资源路径、协议/版本
- 请求方式:POST
- 资源路径:/brand
- 协议/版本:HTTP/1.1
- 请求头(以上图中黄色部分)
- 请求体和请求头之间是有一个空行隔开(作用:用于标记请求头结束)
- 请求体(以上图中绿色部分) :存储请求参数
五、GET请求和POST请求的区别
区别方式 | GET请求 | POST请求 |
---|---|---|
请求参数 | 请求参数在请求行中。 例:/brand/findAll?name=OPPO&status=1 | 请求参数在请求体中 并且请求报文多了和请求体相关的配置[请求头] |
请求参数长度 | 请求参数长度有限制(浏览器不同限制也不同) | 请求参数长度没有限制 |
安全性 | 安全性低。原因:请求参数暴露在浏览器地址栏中。 | 安全性相对高,但效率比GET低 |
当我们提交了表单数据后,在谷歌浏览器里它是放在payload里面,在请求体里我们是看不见的