一、HTTP 基础概念
1. 定义
- HTTP 是一种 应用层协议,用于在客户端(如浏览器)和服务器之间传输超文本(如HTML、图片、视频等)。它是万维网(WWW)数据通信的基础。
2. 核心特性
-
无状态:默认不保存客户端与服务器之间的交互状态(需通过 Cookie 或 Session 管理状态)。
-
请求-响应模型:客户端发起请求,服务器返回响应。
-
可扩展性:通过请求头、响应头和状态码支持灵活的功能扩展。
-
基于文本(HTTP/1.x):早期版本使用明文传输(HTTP/2 及之后支持二进制格式)。
3. 协议依赖
-
默认运行在 TCP/IP 协议之上,端口为 80(HTTP) 或 443(HTTPS) 。
-
结合 DNS 解析域名,将 URL 转换为 IP 地址。
二、HTTP 核心概念
1. 请求组成
(1) 请求行
-
位置:HTTP 请求的第一行。
-
格式:
<方法> <请求目标> <HTTP版本>
-
作用:
-
方法:定义客户端希望执行的操作(如
GET
、POST
、具体请看下面HTTP方法介绍
)。 -
请求目标:指定资源路径(如
/api/data
)和查询参数(如?id=1
)。 -
HTTP版本:声明使用的协议版本(如
HTTP/1.1
)。-
常见版本:
-
HTTP/1.0:早期版本,默认关闭连接复用。
-
HTTP/1.1(主流):支持持久连接、管道化、分块传输等。
-
HTTP/2:二进制协议、多路复用、头部压缩。
-
HTTP/3:基于 QUIC(UDP),解决队头阻塞。
-
-
-
例子:
GET /api/data?id=1 HTTP/1.1
(2) 请求头
-
位置:请求行之后,空行之前。
-
格式:
字段名: 值
-
作用:传递客户端信息、内容协商、身份验证等。
-
常见请求头: (更多请看文档)
字段名 示例值 作用 Host
example.com
指定目标服务器域名和端口 User-Agent
Mozilla/5.0 ...
标识客户端类型(浏览器/设备) Accept
application/json
声明接受的响应格式 Content-Type
application/json
指定请求体的数据类型 Authorization
Bearer eyJhbGci...
携带身份验证令牌 Cookie
sessionId=abc123
发送服务器设置的 Cookie Expires
Wed, 21 Oct 2022 07:28:00 GMT
强缓存
指定资源的绝对过期时间Cache-Control
no-cache
强缓存
优先级高于Expires
,常用指令:max-age=3600
:缓存有效期(秒)。 -no-cache
:跳过强缓存,直接进入协商缓存。 -no-store
:禁止任何缓存(完全禁用缓存)。 -public
:允许代理服务器缓存资源。 -private
:仅允许客户端缓存资源。If-Modified-Since
Wed, 21 Oct 2022 07:28:00 GMT
协商缓存
资源最后修改时间(精确到秒级)If-None-Match
"abc123"
协商缓存
资源唯一标识符(如哈希值),更精确(应对频繁修改或分布式系统)。第一次请求该参数空,通过第一次后端返回该参数,第二次
(3) 请求体
-
位置:空行之后。
-
格式:纯文本、JSON、表单数据、二进制等。
-
作用:携带客户端提交的数据(如 POST 请求的表单、文件)。
-
适用场景:
-
POST
、PUT
、PATCH
方法通常需要请求体。 -
GET
、HEAD
、DELETE
一般不使用请求体。
-
-
例子:
{"username": "123", "password": "123456"}
2. 响应组成
(1) 状态行
-
位置:HTTP 响应的第一行。
-
格式:
<HTTP版本> <状态码> <状态描述>
-
作用:
-
HTTP版本:服务器使用的协议版本。
-
状态码:3位数字代码,表示请求处理结果。
-
状态描述:对状态码的简要说明(如
OK
、Not Found
)
-
-
例子:
HTTP/1.1 200 OK
(2) 响应头
-
位置:状态行之后,空行之前。
-
格式:
字段名: 值
-
作用: 传递服务器信息、控制缓存、设置 Cookie 等。
-
常见请求头: (更多请看文档)
(2.1) 内容描述
字段名 | 作用 | 示例 |
---|---|---|
Content-Type | 声明响应体的数据类型和字符编码(MIME类型)。 | Content-Type: text/html; charset=utf-8 Content-Type: application/json |
Content-Length | 响应体的字节长度(适用于非分块传输)。 | Content-Length: 348 |
Content-Encoding | 声明响应体使用的压缩算法(如 gzip )。 | Content-Encoding: gzip |
Content-Language | 声明响应内容的自然语言(如中文、英文)。 | Content-Language: zh-CN |
(2.2) 缓存控制
字段名 | 作用 | 示例 |
---|---|---|
Cache-Control | 控制客户端和代理服务器的缓存行为。 | Cache-Control: max-age=3600 Cache-Control: no-cache |
Expires | 指定资源的绝对过期时间(HTTP/1.0)。 | Expires: Wed, 21 Oct 2022 07:28:00 GMT |
ETag | 资源的唯一标识符(用于协商缓存)。 | ETag: "abc123" |
Last-Modified | 资源的最后修改时间(用于协商缓存)。 | Last-Modified: Wed, 21 Oct 2022 07:28:00 GMT |
(2.3) 安全与策略
字段名 | 作用 | 示例 |
---|---|---|
Access-Control-Allow-Origin | 指定允许跨域请求的源(用于CORS)。 | Access-Control-Allow-Origin: * Access-Control-Allow-Origin: https://example.com |
Content-Security-Policy | 定义内容安全策略(防御XSS攻击)。 | Content-Security-Policy: default-src 'self' |
Strict-Transport-Security | 强制使用HTTPS(HSTS)。 | Strict-Transport-Security: max-age=31536000 |
X-Content-Type-Options | 禁止浏览器猜测内容类型(防MIME嗅探)。 | X-Content-Type-Options: nosniff |
(2.4) 其他常用头
字段名 | 作用 | 示例 |
---|---|---|
Location | 重定向目标URL(用于3xx状态码)。 | Location: https://new.example.com |
Set-Cookie | 设置客户端的Cookie(用于会话管理)。 | Set-Cookie: sessionId=abc123; Path=/; Secure |
Server | 标识服务器软件(如Nginx、Apache)。 | Server: nginx/1.18.0 |
Transfer-Encoding | 声明传输编码方式(如分块传输 chunked )。 | Transfer-Encoding: chunked |
(3) 响应体
-
位置:空行之后。
-
格式:
HTML、JSON、图片、视频等。
内容类型( Content-Type
)常见格式示例 说明 text/html
HTML页面 <html>...</html>
application/json
JSON数据 {"status": "success", "data": {}}
image/png
二进制图片数据 (无法直接显示为文本) application/octet-stream
文件下载 (二进制流) text/plain
纯文本 Hello World!
-
作用:返回客户端请求的资源或处理结果,以及状态码。
3. http方法
方法 | 作用 | 幂等性 | 安全性 |
---|---|---|---|
GET | 获取资源(不修改服务器数据) | 是 | 是 |
POST | 提交数据(如表单、文件上传) | 否 | 否 |
PUT | 替换目标资源(全量更新) | 是 | 否 |
DELETE | 删除指定资源 | 是 | 否 |
PATCH | 部分更新资源 | 否 | 否 |
HEAD | 获取资源的元信息(无响应体) | 是 | 是 |
OPTIONS | 查询服务器支持的通信选项(如 CORS 预检) | 是 | 是 |
4. 状态码
(4.1). 信息性状态码(1xx)
状态码 | 名称 | 说明 | 场景示例 |
---|---|---|---|
100 | Continue | 客户端应继续发送请求体(用于大文件上传前的预检)。 | 客户端发送 Expect: 100-continue 头后,服务器返回 100。 |
101 | Switching Protocols | 服务器同意切换协议(如从 HTTP 切换到 WebSocket)。 | WebSocket 握手阶段。 |
(4.2). 成功状态码(2xx)
状态码 | 名称 | 说明 | 场景示例 |
---|---|---|---|
200 | OK | 请求成功,响应体中包含请求的资源。 | GET 请求返回 HTML 页面或 JSON 数据。 |
201 | Created | 资源已成功创建(通常用于 POST 或 PUT 请求)。 | 创建新用户后返回 201 和新用户 URL。 |
204 | No Content | 请求成功,但响应体无内容(常用于 DELETE 或更新操作)。 | 删除资源后返回空响应。 |
206 | Partial Content | 服务器返回部分内容(用于分块下载或断点续传)。 | 视频流的分段传输。 |
(4.3). 重定向状态码(3xx)
状态码 | 名称 | 说明 | 场景示例 |
---|---|---|---|
301 | Moved Permanently | 资源已永久移动到新 URL(客户端应更新书签)。 | 网站域名更换后旧域名跳转。 |
302 | Found | 资源临时移动到新 URL(客户端下次仍请求原 URL)。 | 临时维护页面跳转。 |
304 | Not Modified | 资源未修改,客户端使用本地缓存(协商缓存验证)。 | 缓存有效的资源请求。 |
307 | Temporary Redirect | 临时重定向(与 302 类似,但要求保持请求方法不变)。 | POST 请求的临时重定向。 |
308 | Permanent Redirect | 永久重定向(与 301 类似,但要求保持请求方法不变)。 | API 版本永久迁移。 |
(4.4). 客户端错误(4xx)
状态码 | 名称 | 说明 | 场景示例 |
---|---|---|---|
400 | Bad Request | 请求语法错误或参数无效(通用客户端错误)。 | JSON 请求体格式错误。 |
401 | Unauthorized | 未提供有效身份验证凭据(需登录或 Token)。 | 访问需登录的页面未携带 Token。 |
403 | Forbidden | 服务器拒绝执行请求(权限不足)。 | 普通用户尝试访问管理员页面。 |
404 | Not Found | 请求的资源不存在。 | 访问不存在的 URL。 |
405 | Method Not Allowed | 请求方法不被允许(如对只读资源发送 POST)。 | 对静态资源发送 DELETE 请求。 |
408 | Request Timeout | 服务器等待请求超时。 | 客户端未在指定时间内发送完整请求。 |
429 | Too Many Requests | 客户端发送请求过多(限流)。 | API 调用频率超过限制。 |
(4.5). 服务器错误(5xx)
状态码 | 名称 | 说明 | 场景示例 |
---|---|---|---|
500 | Internal Server Error | 服务器内部错误(通用错误码,通常为代码异常)。 | 未捕获的代码异常导致服务崩溃。 |
502 | Bad Gateway | 网关或代理服务器从上游服务器收到无效响应。 | Nginx 代理的后端服务无响应。 |
503 | Service Unavailable | 服务器暂时不可用(如维护或过载)。 | 服务器重启或维护页面。 |
504 | Gateway Timeout | 网关或代理服务器未及时从上游服务器获取响应。 | 后端服务响应超时。 |
(4.6). 特殊状态码
状态码 | 名称 | 说明 |
---|---|---|
418 | I'm a teapot | 彩蛋状态码(来自愚人节玩笑 RFC 7168),无实际用途。 |
451 | Unavailable For Legal Reasons | 因法律原因不可访问(如政府审查)。 |
5. 其他参数详细介绍
-
(5.1) http 请求头 Content-Type 常见类型参数
分类 Content-Type 值 描述 示例/备注 文本类型 text/plain
纯文本,无格式(如 .txt
文件)Content-Type: text/plain; charset=UTF-8
text/html
HTML 文档(网页内容) Content-Type: text/html
text/css
CSS 样式表 Content-Type: text/css
text/csv
CSV(逗号分隔值文件) Content-Type: text/csv
text/javascript
(已过时)JavaScript 代码(推荐改用 application/javascript
)旧代码可能仍在使用 应用类型 application/json
JSON 格式数据,广泛用于 API 通信 Content-Type: application/json; charset=UTF-8
application/xml
XML 格式数据 Content-Type: application/xml
application/x-www-form-urlencoded
表单默认提交方式,数据编码为键值对(如 key1=value1&key2=value2
)普通表单提交 multipart/form-data
文件上传时使用,数据分多部分传输 Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryABC123
application/octet-stream
二进制流数据(如文件下载) 用于未知或任意二进制文件 application/pdf
PDF 文件 Content-Type: application/pdf
application/zip
ZIP 压缩文件 Content-Type: application/zip
图像类型 image/jpeg
JPEG 图像 Content-Type: image/jpeg
image/png
PNG 图像 Content-Type: image/png
image/gif
GIF 图像 Content-Type: image/gif
image/svg+xml
SVG 矢量图(基于 XML) Content-Type: image/svg+xml
音视频类型 audio/mpeg
MP3 音频文件 Content-Type: audio/mpeg
video/mp4
MP4 视频文件 Content-Type: video/mp4
其他类型 application/javascript
JavaScript 代码 替代 text/javascript
application/ld+json
JSON-LD(结构化数据格式) 用于语义网或 SEO 优化 application/vnd.ms-excel
Excel 文件(旧版 .xls
)Content-Type: application/vnd.ms-excel
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
Excel 文件(新版 .xlsx
)长 MIME 类型,需确保正确设置 常见使用场景 推荐 Content-Type API 请求(JSON 数据) application/json
文件上传(表单) multipart/form-data
普通表单提交 application/x-www-form-urlencoded
二进制文件下载 application/octet-stream
-
**(5.2) **
-
**(5.3) **
-
**(5.4) **