什么是HTTP
HTTP 是超文本传输协议
我们从HTTP的名字来详细拆解他是什么
- 协议:这表明了这是一种计算机之间九六通信的规范
- 传输:表示用于数据的传输
- 超文本:文字,图片,视频等的混合体,最关键的是超链接,从一个超文本跳转到另一个超文本。
HTTP请求和响应的基本流程:
-
建立连接:客户端(通常是Web浏览器)与服务器之间通过TCP/IP协议建立连接。默认情况下,HTTP使用端口号为80的TCP连接,或者使用端口号为443的加密连接(HTTPS)。
-
发送请求:客户端构建HTTP请求并发送给服务器。请求包括请求行、请求头部和请求正文。请求行包含请求方法(例如GET、POST)、请求的URL和协议版本。请求头部包含一些附加信息,如主机名、用户代理(User-Agent)和内容类型等。
-
服务器处理:服务器收到请求后,根据请求行和头部信息进行相应的处理。这包括查找请求的资源、验证身份、执行业务逻辑等。服务器也可以生成一个HTTP响应来提供所需的数据。
-
发送响应:服务器构建HTTP响应并发送给客户端。响应包括响应行、响应头部和响应正文。响应行包含状态码(例如200、404)和协议版本。响应头部包含附加的响应信息,如内容类型、长度和缓存控制等。响应正文包含服务器返回的实际数据。
-
接收响应:客户端接收到服务器发送的响应后,开始处理响应内容。根据内容类型和需求,客户端可能会将响应解析为HTML页面、图像、视频或其他数据类型。然后,客户端使用解析后的数据来展示内容或执行其他操作。
-
关闭连接:当请求和响应的交换完成后,客户端和服务器可以选择关闭连接,释放资源。HTTP1.1引入了持久连接的概念,允许多个请求和响应通过同一个连接进行交换,以提高性能。
这些步骤描述了HTTP请求和响应的基本流程。实际应用中,还可能涉及到缓存、认证、重定向等其他概念和步骤。HTTP的灵活性和开放性使其成为Web应用程序通信的标准协议。
在介绍了基本的流程之后,我们再来介绍一下这个过程中最重要的两个部分:请求报文和响应报文。
请求报文:
HTTP请求报文是客户端发送给服务器的数据块,它包含了客户端对服务器的请求内容和相关信息。HTTP请求报文由以下几个部分组成:
java
+---------------------------+
| 请求行 |
+---------------------------+
| 请求头部字段 |
+---------------------------+
| 空行 |
+---------------------------+
| 请求体 |
+---------------------------+
- **请求行(Request Line):**请求行由三个部分组成,它们之间使用空格进行分隔:
请求方法(Request Method):定义了要执行的操作类型,如GET、POST、PUT、DELETE等。
请求目标(RequestTarget):表示请求要访问的资源的路径。
协议版本(Protocol Version):使用的HTTP协议的版本,如HTTP/1.1。
请求头部(Request Headers):请求头部包含关于请求的附加信息,每个头部字段都以键值对的形式出现。常见的请求头部字段包括:
Host:指定要访问的服务器主机名。 User-Agent:发送请求的用户代理,通常是浏览器标识。
Content-Type:请求的数据类型,如application/json或application/x-www-form-urlencoded。
Content-Length:请求正文的长度。 Authorization:对请求进行身份验证的凭证。
空行(Blank Line):空行用于分隔请求头部和请求正文。
请求正文(Request Body):请求正文包含了具体的请求数据,例如表单数据、JSON数据等。并非所有请求都需要请求正文,某些请求(如GET请求)通常不包含请求正文。
响应报文:
java
+----------------------------------+
| 状态行 |
+----------------------------------+
| 响应头部字段 |
+----------------------------------+
| 空行 |
+----------------------------------+
| 响应体 |
+----------------------------------+
HTTP响应报文是服务器返回给客户端的数据块,它包含了服务器对客户端请求的响应内容和相关信息。HTTP响应报文由以下几个部分组成:
响应状态行(Status Line):响应状态行由三个部分组成,它们之间也使用空格进行分隔:
协议版本(Protocol Version):使用的HTTP协议的版本,如HTTP/1.1。
状态码(StatusCode):表示服务器对请求的处理结果,常见的状态码有 200(OK,请求成功)、404(Not
Found,资源不存在)、500(Internal Server Error,服务器内部错误)等。
状态信息(StatusMessage):与状态码对应的可读性描述。
响应头部(Response Headers):响应头部包含关于响应的附加信息,例如:
Content-Type:响应数据的类型,如text/html或application/json。
Content-Length:响应正文的长度。
Cache-Control:控制缓存的行为。
Set-Cookie:设置Cookie。
空行(Blank Line):空行用于分隔响应头部和响应正文。
响应正文(Response Body):响应正文包含了服务器返回给客户端的实际数据,例如HTML页面、JSON数据、图像等。
通过请求报文和响应报文,客户端和服务器之间进行通信并交换数据。客户端发送请求报文,服务器根据请求进行处理,并通过响应报文将结果返回给客户端。这种请求-响应模型是HTTP通信的基础。
了解了这些之后,我们在讲一讲在请求和响应报文中比较重要的一个知识点:
HTTP常见的状态码

2xx 成功
200 OK
- 请求成功
- 最常见的状态码
201 Created
- 请求成功,并创建了新资源
- 常见于注册、创建数据
3xx 重定向
301 Moved Permanently
- 永久重定向
- 资源已被永久移动到新地址
302 Found
- 临时重定向
- 常见于登录跳转
4xx 客户端错误
400 Bad Request
- 请求参数错误或格式不正确
401 Unauthorized
- 未认证(通常是未登录)
403 Forbidden
- 已认证,但无权限访问
404 Not Found
- 请求的资源不存在(非常常见)
5xx 服务器错误
500 Internal Server Error
- 服务器内部错误(最常见)
502 Bad Gateway
- 网关错误(服务器之间通信失败)
503 Service Unavailable
- 服务不可用(服务器过载或维护)
504 Gateway Timeout
- 网关超时(服务器响应太慢)
HTTP 常见字段有哪些?
- Host字段:用于给客户端发送请求时,来指定服务器域名。
有了Host字段,就可以将请求发往同一台服务器上的不同网站 - Content-Length 字段:用于告诉浏览器,本次访问回应的数据长度是多少字节
- Connection 字段:用于客户端要求服务器使用HTTP长连接机制(也就是我们常说的TCP三次握手协议)
- Content-Type 字段:用于服务器回应时,告诉客户端,本次数据是什么格式
- Content-Encoding 字段:用于表示服务器返回数据使用了什么压缩格式
GET和POST请求区分
GET :意为从服务器获取指定的资源(只读)
特点:
- 安全:意为请求操作不会对服务器上的资源造成破坏
- 幂等:多次执行相同的操作,结果都一样(
给一个视频多次点赞,点赞数永远只会+1)
- 可被缓存的
POST :根据请求负荷(报文body)对指定资源做出处理
特点:
- 不安全
- 不幂等
- 不可被缓存
HTTP缓存技术
强制缓存
只要浏览器判断缓存没有过期,则可以直接用浏览器本地缓存
协商缓存

流程如上图所示
协商缓存就是与服务端协商过后,通过协商结果来判断是否使用本地缓存
总结
本篇文章主要讲解了
- 什么是HTTP协议
- HTTP请求和响应的流程
- 常见的状态码
- 常见字段
- GET和POST请求区分
- 缓存技术