1. 简介
HTTP 概念
HyperText Transfer Protocol,超文本传输协议,规定了浏览器和服务器之间数据传输的规则
-
数据传输的规则指的是请求数据和响应数据需要按照指定的格式进行传输。
-
如果想知道具体的格式,可以打开浏览器,点击
F12
打开开发者工具,点击Network
来查看某一次请求的请求数据和响应数据具体的格式内容,如下图所示:
注意:在浏览器中如果看不到上述内容,需要清除浏览器的浏览数据。chrome 浏览器可以使用 ctrl+shift+Del 进行清除。
所以学习 HTTP 主要就是学习请求和响应数据的具体格式内容
HTTP 协议特点
HTTP 协议有它自己的一些特点,分别是:
-
基于 TCP 协议: 面向连接,安全
TCP 是一种面向连接的(建立连接之前是需要经过三次握手)、可靠的、基于字节流的传输层通信协议,在数据传输方面更安全。
-
基于请求-响应模型的:一次请求对应一次响应
请求和响应是一一对应关系
-
HTTP 协议是无状态协议:对于事物处理没有记忆能力。每次请求-响应都是独立的
无状态指的是客户端发送 HTTP 请求给服务端之后,服务端根据请求响应数据,响应完后,不会记录任何信息。这种特性有优点也有缺点,
- 缺点:多次请求间不能共享数据
- 优点:速度快
请求之间无法共享数据会引发的问题,如:
- 京东购物,
加入购物车
和去购物车结算
是两次请求, - HTTP 协议的无状态特性,加入购物车请求响应结束后,并未记录加入购物车是何商品
- 发起去购物车结算的请求后,因为无法获取哪些商品加入了购物车,会导致此次请求无法正确展示数据
具体使用的时候,我们发现京东是可以正常展示数据的,原因是 Java 早已考虑到这个问题,并提出了使用
会话技术(Cookie、Session)
来解决这个问题。具体如何来做,我们后面会详细讲到。刚才提到 HTTP 协议是规定了请求和响应数据的格式,那具体的格式是什么呢?
2. 请求数据格式
2.1 格式介绍
请求数据总共分为三部分内容,分别是 请求行、请求头、请求体
-
请求行: HTTP 请求中的第一行数据,请求行包含三块内容,分别是 GET[请求方式] /[请求 URL 路径] HTTP/1.1[HTTP 协议及版本]
请求方式有七种,最常用的是 GET 和 POST
-
请求头: 第二行开始,格式为 key: value 形式
请求头中会包含若干个属性,常见的 HTTP 请求头有:
Host: 表示请求的主机名 User-Agent: 浏览器版本,例如Chrome浏览器的标识类似Mozilla/5.0 ...Chrome/79,IE浏览器的标识类似Mozilla/5.0 (Windows NT ...)like Gecko; Accept:表示浏览器能接收的资源类型,如text/*,image/*或者*/*表示所有; Accept-Language:表示浏览器偏好的语言,服务器可以据此返回不同语言的网页; Accept-Encoding:表示浏览器可以支持的压缩类型,例如gzip, deflate等。
这些数据有什么用处?
举例说明:服务端可以根据请求头中的内容来获取客户端的相关信息,有了这些信息服务端就可以处理不同的业务需求,比如:
- 不同浏览器解析 HTML 和 CSS 标签的结果会有不一致,所以就会导致相同的代码在不同的浏览器会出现不同的效果
- 服务端根据客户端请求头中的数据获取到客户端的浏览器类型,就可以根据不同的浏览器设置不同的代码来达到一致的效果
- 这就是我们常说的浏览器兼容问题
-
请求体: POST 请求的最后一部分,存储请求参数
如上图红线框的内容就是请求体的内容,请求体和请求头之间是有一个空行隔开。此时浏览器发送的是 POST 请求,为什么不能使用 GET 呢?这时就需要回顾 GET 和 POST 两个请求之间的区别了:
- GET 请求请求参数在请求行中,没有请求体,POST 请求请求参数在请求体中
- GET 请求请求参数大小有限制,POST 没有
3. 响应数据格式
3.1 格式介绍
响应数据总共分为三部分内容,分别是响应行、响应头、响应体
-
响应行:响应数据的第一行,响应行包含三块内容,分别是 HTTP/1.1[HTTP 协议及版本] 200[响应状态码] ok[状态码的描述]
-
响应头:第二行开始,格式为 key:value 形式
响应头中会包含若干个属性,常见的 HTTP 响应头有:
Content-Type:表示该响应内容的类型,例如text/html,image/jpeg; Content-Length:表示该响应内容的长度(字节数); Content-Encoding:表示该响应压缩算法,例如gzip; Cache-Control:指示客户端应如何缓存,例如max-age=300表示可以最多缓存300秒
-
响应体: 最后一部分。存放响应数据
上图中...这部分内容就是响应体,它和响应头之间有一个空行隔开。
3.2 响应状态码
关于响应状态码,我们先主要认识三个状态码,其余的等后期用到了再去掌握:
- 200 ok 客户端请求成功
- 404 Not Found 请求资源不存在
- 500 Internal Server Error 服务端发生不可预期的错误