HTTP 协议基础
# 25.HTTP 协议基础
在继续学习 JavaWeb 之前,我们来复习下 HTTP 基础,HTTP 也是一个很重要的知识
# HTTP 介绍
HTTP 全称 Hyper Text Transfer Protocol,译为超文本传输协议。
HTTP 是一种传输协议,定义了客户端和服务器端通信时,发送数据的格式。浏览器请求服务器,其实就是发送一些数据给到服务器;服务器响应浏览器,也是发送一些数据。HTTP 就是定义了格式。
HTTP 协议特点:
- 基于 TCP/IP 的高级协议
- 默认端口号: 80
- 基于请求/响应模型: 一次请求对应一次响应
- 无状态的:每次请求之间相互独立,不能交互数据
HTTP 协议版本:
1.0:每一次请求响应都会建立新的连接。例如访问某个网站,实际上会有多次请求、多次相应。例如下载 logo,JS 资源,HTML 文件。请求完一个文件后会断开连接,非常影响传输的效率(因为 TCP 建立连接是需要花时间的)
例如访问本站 从 01 开始 (opens new window),打开浏览器控制台,可以看到有很多个请求(每一行都是一个 HTTP 请求)
1.1:对 1.0 的升级版,会复用连接,比如请求完后,不会马上断开,而是会等待一会,如果还有请求发送过来,则使用该连接。目前 HTTP 1.1 使用广泛。然后 1.1 和 1.0 的区别还有很多,我们目前只介绍一个
我们目前介绍下请求消息的数据格式,后续再介绍响应消息的数据格式
# 请求消息数据格式
分为四部分:
- 请求行
- 请求头
- 请求空行
- 请求体(正文)
我们来看一个实际的 HTTP 请求例子,打开浏览器和控制台,然后访问 http://localhost:8080/hello/ServletHttpDemo1Post.jsp
也就是我们请求资源的时候,发送给服务器的数据如下:
GET /hello/ServletHttpDemo1Post.jsp HTTP/1.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cache-Control: max-age=0
Connection: keep-alive
Cookie: JSESSIONID=45EE153467713CD348E7512827D1548C; Hm_lvt_267c5680c2ffb468ca29c45ffe6801da=1676989465; Hm_lvt_935c298d3de674300e25695d1ece4c34=1677722338,1678069169,1678670145,1679275245; Hm_lpvt_935c298d3de674300e25695d1ece4c34=1679276128
Host: localhost:8080
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36
sec-ch-ua: "Google Chrome";v="111", "Not(A:Brand";v="8", "Chromium";v="111"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 请求行
请求行的格式:请求方式 请求 url 请求协议/版本
例如上述例子中,请求行为: GET /hello/ServletHttpDemo1Post.jsp HTTP/1.1
请求方式:HTTP 协议有 7 中请求方式,常用的有 2 种
GET:
- 请求参数在请求行中,在 url 后,用?问号连接。
- 请求的 url 长度有限制的
- 不太安全,通过 url 就能获取到参数
POST:
- 请求参数在请求体中
- 请求的 url 长度没有限制的,因此文件上传只能用 post
- 相对安全
# 请求头
请求头:客户端浏览器告诉服务器一些信息。格式为键值格式,冒号分割: 请求头名称: 请求头值
。请求头与请求行没有分隔符
POST /hello/httpDemo1 HTTP/1.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Connection: keep-alive
Cookie: JSESSIONID=E7758AAD07EED8A7EC11AAC37512B9EF; Hm_lvt_267c5680c2ffb468ca29c45ffe6801da=1676989465; Hm_lvt_935c298d3de674300e25695d1ece4c34=1677722338,1678069169,1678670145,1679275245; Hm_lpvt_935c298d3de674300e25695d1ece4c34=1679276128
Host: localhost:8080
Referer: http://localhost:8080/hello/ServletHttpDemo1Post.jsp
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: same-origin
Sec-Fetch-User: ?1
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36
sec-ch-ua: "Google Chrome";v="111", "Not(A:Brand";v="8", "Chromium";v="111"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
常见的请求头作用:
- Accept:告诉服务器,我作为浏览器能接受什么类型的信息,例如 html,xml,图片.......
- Accept-Encoding:支持的编码
- Accept-Language:支持的语言,例如 zh-CN 是中文
- Connection: keep-alive,表明该连接是 alive 活着的,也就是 HTTP 1.1 可以被复用的连接
- Host:请求的主机地址,这里是 localhost: 8080
- User-Agent:浏览器告诉服务器,我访问你使用的浏览器版本信息,比较重要。可以在服务器端获取 User-Agent 的信息,解决浏览器的兼容性问题。
- Referer:告诉服务器,我(当前请求)从哪里来?作用:防盗链、统计工作,比较重要
- 其他请求头信息我们后续再说,并不是所有请求头都很重要。
# 请求空行
空行,就是用于分割 POST 请求的请求头和请求体的。
# 请求体
请求体(正文):封装 POST 请求消息的请求参数的(例如:username = peterjxl),
如果用 get 则没有请求体,参数直接在请求行中。例如我们将刚刚的表单改为 get
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>测试post请求</title>
</head>
<body>
<form action="/hello/httpDemo1" method="get">
<span>用户名:</span><input type="text" name="username" placeholder="请输入用户名">
<input type="submit" value="点击发送post请求">
</form>
</body>
</html>
2
3
4
5
6
7
8
9
10
11
12
13
然后尝试发送: