HTTP
一 概念
Hyper Text Transfer Protocol 超文本传输协议(定义了客户端和服务器端通信时,发送数据的格式)
二 特点
- 基于TCP/IP的高级协议
- 默认端口号:80
- 基于请求和响应模型:一次请求对应一次响应
- 无状态的:每次请求之间相互独立,不能交互数据
- 历史版本:
- 1.0:每一次请求响应都会建立新的链接
- 1.1:复用链接
三 请求消息
含义:客户端发送给服务器的数据
3.1 请求数据消息数据格式
-
请求行
- 组成:请求方式 请求url 请求协议/版本
- 请求方式:HTTP协议有7种请求方式,常用2种
- GET:
- 请求参数在请求行中,在url后
- 请求的url长度有限制
- 不太安全
- POST
- 请求参数在请求体中
- 请求的url长度没有限制
- 相对安全
- GET:
-
请求头:客户端浏览器告诉服务器一些信息。头名称是固定的,头值是不一样的
- 格式:请求头名称:请求头值
- 常见的请求头
- User-Agent:客服端访问时使用的浏览器版本信息,服务器可以获取该头信息,解决兼容问题
- Referer:告诉服务器,我(当前请求)从哪里来
- Accept:作为浏览器可以接收的什么样的响应信息格式
- Accept-Language:浏览器可以接收的语言环境
- Accept-Encoding:浏览器可以接收的压缩格式
- Connection:告诉服务器,浏览器的链接状态
-
请求空行:用于分割的空行
-
请求体(正文)
-
封装POST请求消息的请求参数
-
GET请求方式没有请求体
3.2 请求消息的字符串格式
POST /login.html 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.9
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Connection: keep-alive
Host: localhost:8080
Referer: http://localhost:8080/servlet_request_war_exploded/
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36
username=z3
四 响应消息
含义:服务器发送给客户端的数据
3.1 响应数据消息数据格式
-
响应行
- 组成:协议/版本 响应状态码 状态码描述
- 响应状态码:服务器告诉客户端浏览器本次请求和响应的一个状态。响应状态码都是3位数:
- 1xx:服务器接受客户端消息,但没有接受完成,等待一段时间后,发送1xx状态码
- 2xx:成功。
- 3xx:重定向。
- 302(重定向)
- 304(访问缓冲):本地浏览器中已经缓存了一些资源,且不需要更新时。
- 4xx:客户端错误。
- 404:(请求路径没有对应的资源)
- 405:(请求方式没有对应的doXxx方法)
- 5.5xx:服务器端错误。代表(服务器内部出现异常)
- 响应状态码:服务器告诉客户端浏览器本次请求和响应的一个状态。响应状态码都是3位数:
- 组成:协议/版本 响应状态码 状态码描述
-
响应头
- 格式:头名称:值
- 常见的响应头:
- Content-Type:服务器告诉客户端本次响应体数据格式及编码格式,客户端浏览器会根据改编码格式解析这资源
- Content-disposition:服务器告诉客户端以什么格式打开响应体数据
- in-line:默认值,在当前页面内打开
- attachment;filename=xxx:以附件形式打开响应体。文件下载
-
响应空行
-
响应体
- 参数的数据
4.2 响应消息的字符串格式
HTTP/1.1 200 OK
Content-Length: 99
Content-Type: text/html;charset=UTF-8
Date: Thu, 14 Jan 2021 08:48:42 GMT
<html>
<head>
<title>$Title$</title>
</head>
<body>
hello response
</body>
</html>
五 HTTP路径写法
路径分类
-
相对路径:通过相对路径不可以确定唯一资源
-
相对路径的格式:./index.html(不是以/开头,而是以**./**开头路径)
-
如何写相对路径:找到当前资源和目标资源之间的相对位置关系
- ./:当前目录(./可以省略不写)
<a href="./response1">response1</a> <a href="response1">response1</a>
- …/:退后一集目录
<a href="../response1">response1</a>
-
绝对路径:通过绝对路径可以确定唯一资源
- 绝对路径的格式:/项目名/资源名称(以**/**开头的路径)
-
如何判断写相对路径还是绝对路径:判断请求是从哪里发出的
-
从客户端浏览器发出(重定向):需要加虚拟目录(项目的访问路径)
建议虚拟目录动态获取:request.getContextPath()
-
从服务器发出(转发):不需要加虚拟目录
-