这是我参与「第五届青训营 」笔记创作活动的第9天
一、本堂课重点内容:
- HTTP 协议的基本定义
- HTTP 协议主要特征
- HTTP 协议发展历程
- HTTP 协议的报文结构
二、详细知识点介绍:
HTTP 协议的基本定义
HTTP (Hypertext Transfer Protocol) 是一种用于在网络上传输超文本的协议。它是互联网上数据通信的基础,用于在浏览器和网站服务器之间传输数据。HTTP 使用请求/响应模型来传输数据,即浏览器发送一个请求到服务器,服务器返回一个响应。 HTTP 协议是一个基于文本的协议,所以它的消息格式非常简单,易于阅读和编写。
HTTP 协议主要特征
-
基于请求/响应模型: HTTP 使用请求/响应模型来传输数据,即客户端发送请求到服务器,服务器返回响应。
-
无状态协议: HTTP 是无状态协议,这意味着服务器不会记住客户端的信息,每个请求都是独立的。
-
易于理解和实现: HTTP 使用简单的文本格式来编码和解码消息,易于阅读和编写。
-
支持多种请求方法: HTTP 支持多种请求方法,包括 GET,POST,HEAD,PUT 和 DELETE 等。
-
支持多种类型的媒体: HTTP 支持传输多种类型的媒体,包括文本,图像,视频,音频
HTTP 协议发展历程
HTTP 协议的报文结构
下面是一个请求报文的具体实例:
GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:115.0) Gecko/20100101 Firefox/115.0
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
这是一个请求首页的报文。首先是请求行,它由三部分组成,请求方法为 GET,请求 URI 为 /index.html,协议版本为 HTTP/1.1。
接下来是请求头,包括 Host,User-Agent,Accept-Language,Accept-Encoding,Connection 等。其中 Host 表示请求的主机名,User-Agent 表示请求使用的浏览器类型和版本,Accept-Language 表示请求支持的语言,Accept-Encoding 表示请求支持的编码方式,Connection 表示请求是否保持连接。
这里没有请求正文,因为 GET 方法不需要请求正文。
下面是一个响应报文的具体实例:
HTTP/1.1 200 OK
Server: Apache/2.4.29 (Ubuntu)
Last-Modified: Mon, 26 Oct 2020 11:34:54 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 912
Connection: keep-alive
<!DOCTYPE html>
<html>
<head>
<title>Example Website</title>
</head>
<body>
<h1>Welcome to our website!</h1>
<p>Here you can find information about our company and products.</p>
</body>
</html>
首先是状态行,它由三部分组成,协议版本为 HTTP/1.1,状态码为 200,状态码的描述为 OK。
接下来是响应头,包括 Server,Last-Modified,Content-Type,Content-Length,Connection 等。其中 Server 表示响应的服务器名称和版本,Last-Modified 表示响应的资源最后修改时间,Content-Type 表示响应正文的类型和编码,Content-Length 表示响应正文的长度,Connection 表示响应是否保持连接。
最后是响应正文,这里是一段 HTML 代码。
Methed
Safe(安全的):不会修改服务器的数据的方法
GET HEAD OPTIONS
Idempotent(幂等):同样的请求被执行一次与连续执行多次的效果是一样的,服务器的状态也是一样的 所有safe的方法都是Idempotent的
GET HEAD OPTIONS PUT DELETE
状态码
HTTP 协议的状态码,也叫响应码,是用来表示服务器对客户端请求的响应结果的。状态码由三位数字组成,第一位数字表示响应的类别,后两位数字提供具体信息。
常见的状态码有:
1xx(信息类):表示收到请求,继续处理。
2xx(成功类):表示请求成功,如 200 OK。
3xx(重定向类):表示需要进行附加操作以完成请求,
4xx(客户端错误类):表示客户端发送的请求有错误,
5xx(服务器错误类):表示服务器无法完成对请求的处理。
例如,当客户端发送一个 GET 请求给服务器,服务器返回 200 OK 状态码,表示请求成功并且已经成功返回了请求的资源。如果服务器返回 404 Not Found 状态码,表示客户端请求的资源不存在。
- 200 OK-客户端请求成功
- 301-资源(网页等)被永久转移到其它URL
- 302-临时跳转
- 401 Unauthorized-请求未经授权
- 404-请求资源不存在,可能是输入了错误的URL
- 500-服务器内部发生了不可预期的错误
- 504 Gateway Timeout-.网关或者代理的服务器无法在规定的时间内获得想要的响应。
RESTful API
RESTful API(Representational State Transfer,表现层状态转移)是一种基于 HTTP 协议的 Web API 设计风格。它遵循 RESTful 的设计原则,将资源表示为 URI,通过 HTTP 协议中的各种方法(如 GET、POST、PUT、DELETE)来操作这些资源。
RESTful API 的主要特点有:
- 使用 URI 来表示资源。
- 使用 HTTP 协议中的各种方法(如 GET、POST、PUT、DELETE)来操作资源。
- 使用 HTTP 协议中的状态码和首部字段来表示响应的结果。
例如,一个简单的 RESTful API 可能是这样的:
- GET /users 获取所有用户列表
- POST /users 新建一个用户
- GET /users/{id} 获取指定 id 的用户信息
- PUT /users/{id} 更新指定 id 的用户信息
- DELETE /users/{id} 删除指定 id 的用户信息
请求头和响应头
HTTP 协议中常用的请求头和响应头有:
-
请求头:
- Accept:客户端能够处理的媒体类型。
- Accept-Encoding:指定客户端能够接受的编码。
- Accept-Language:指定客户端能够接受的语言。
- User-Agent:浏览器类型和版本。
- Referer:请求的来源地址。
- Content-Type:请求体的类型。
- Content-Length:请求体的长度。
-
响应头:
- Content-Type:响应体的类型。
- Content-Length:响应体的长度。
- Location:重定向地址。
- Set-Cookie:设置 Cookie。
- Server:服务器的类型和版本。
- Cache-Control:缓存控制。
这些请求头和响应头可以在 HTTP 请求和响应中通过首部字段来传递。
缓存
HTTP 协议中缓存主要是通过缓存控制来实现的。缓存控制主要通过两种方式来实现:
- Cache-Control:缓存控制头。
- Expires:缓存过期时间。
Cache-Control 头是 HTTP/1.1 中新增的,主要用来控制缓存策略。常用的值有:
- no-cache:不使用缓存。
- no-store:不存储任何缓存。
- max-age:缓存的最大生存时间。
- must-revalidate:强制重新验证缓存。
- private:私有缓存。
- public:公共缓存。
Expires 头是 HTTP/1.0 中的缓存控制头,用来指定缓存过期时间。
当浏览器发送请求时,会先检查自己的缓存,如果缓存中有相应的请求结果并且没有过期,就直接使用缓存中的结果。如果缓存中没有请求结果或者已经过期,就会发送请求到服务器。
缓存的机制可以减少网络请求,加快页面加载速度,提高用户体验。
Cookie
Cookie 是一种用来在客户端和服务器之间存储数据的技术。它是由服务器发送到客户端的一小块数据,客户端会在之后的请求中把它发回给服务器。
Cookie 的主要用途是用来记录用户的登录状态、会话信息、个性化设置等。
Cookie 的使用流程是这样的:
- 客户端发送请求到服务器。
- 服务器在响应中添加 Set-Cookie 头,并将 cookie 的数据发送给客户端。
- 客户端接收到 cookie 数据之后,会把它存储到本地。
- 客户端在之后的请求中把 cookie 数据添加到请求头中,发送给服务器。
- 服务器接收到请求时,会从请求头中提取 cookie 数据。
Cookie 会被存储在客户端的浏览器中,它可以在多个请求之间共享数据,它可以实现跨域共享数据。Cookie 可以设置过期时间,过期后会被浏览器删除。
Cookie 可以用来实现会话管理,跟踪用户行为,实现个性化设置等功能。
三、实践练习例子:
假设我们正在使用浏览器访问网站 "example.com"。浏览器会发送一个 HTTP 请求到 example.com 的服务器,请求包含了诸如请求方法,URL,协议版本等信息。这个请求可能看起来像这样:
GET /index.html HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36
Accept-Language: en-US,en;q=0.9
其中 "GET" 是请求方法, "/index.html" 是请求的 URL, "HTTP/1.1" 是协议版本。
服务器收到这个请求后,会返回一个 HTTP 响应,包含了响应码,响应头和响应正文。响应可能看起来像这样:
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1234
<!DOCTYPE html>
<html>
<head>
<title>Example website</title>
</head>
<body>
...
其中 "HTTP/1.1" 是协议版本,"200" 是响应码, "OK" 是响应状态, "Content-Type" 和 "Content-Length" 是响应头,"<!DOCTYPE html>
" 是响应正文。
在这个例子中,浏览器发送了一个 "GET" 请求来获取 "example.com/index.html" 的内容,服务器响应了一个 "200 OK" 状态码,并将 HTML 页面的内容作为响应正文返回给浏览器。浏览器读取响应正文并显示 HTML 页面。这就是 HTTP 协议在网页浏览中的基本工作原理。它使用请求/响应模型在浏览器和服务器之间传输数据,并使用简单的文本格式来编码和解码消息。
需要注意的是,这只是一个简单的例子,实际上 HTTP 协议还有很多其他功能,如缓存,身份验证,文件上传等。
四、课后个人总结:
本节课学习了HTTP协议的基本定义、发展历程、报文结构、Safe和idempotent、状态码、RESTful API、常用请求头和响应头、缓存和cookie等知识点。
在学习过程中,对于RESTful API的理解较为困难,需要多加思考和实践才能深入理解。另外,对于状态码的理解也需要多加练习才能记住并熟练应用。