初识 HTTP 协议 | 青训营笔记

55 阅读9分钟

这是我参与「第五届青训营 」笔记创作活动的第9天

一、本堂课重点内容:

  1. HTTP 协议的基本定义
  2. HTTP 协议主要特征
  3. HTTP 协议发展历程
  4. HTTP 协议的报文结构

二、详细知识点介绍:

HTTP 协议的基本定义

HTTP (Hypertext Transfer Protocol) 是一种用于在网络上传输超文本的协议。它是互联网上数据通信的基础,用于在浏览器和网站服务器之间传输数据。HTTP 使用请求/响应模型来传输数据,即浏览器发送一个请求到服务器,服务器返回一个响应。 HTTP 协议是一个基于文本的协议,所以它的消息格式非常简单,易于阅读和编写。

HTTP 协议主要特征

  1. 基于请求/响应模型: HTTP 使用请求/响应模型来传输数据,即客户端发送请求到服务器,服务器返回响应。

  2. 无状态协议: HTTP 是无状态协议,这意味着服务器不会记住客户端的信息,每个请求都是独立的。

  3. 易于理解和实现: HTTP 使用简单的文本格式来编码和解码消息,易于阅读和编写。

  4. 支持多种请求方法: HTTP 支持多种请求方法,包括 GET,POST,HEAD,PUT 和 DELETE 等。

    image.png

  5. 支持多种类型的媒体: HTTP 支持传输多种类型的媒体,包括文本,图像,视频,音频

HTTP 协议发展历程

image.png

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 的使用流程是这样的:

  1. 客户端发送请求到服务器。
  2. 服务器在响应中添加 Set-Cookie 头,并将 cookie 的数据发送给客户端。
  3. 客户端接收到 cookie 数据之后,会把它存储到本地。
  4. 客户端在之后的请求中把 cookie 数据添加到请求头中,发送给服务器。
  5. 服务器接收到请求时,会从请求头中提取 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的理解较为困难,需要多加思考和实践才能深入理解。另外,对于状态码的理解也需要多加练习才能记住并熟练应用。

五、引用参考:

初识 HTTP 协议