一、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) 请求头
-
位置:请求行之后,空行之前。
-
格式:
字段名: 值 -
作用:传递客户端信息、内容协商、身份验证等。
-
常见请求头: (更多请看文档)
字段名 示例值 作用 Hostexample.com指定目标服务器域名和端口 User-AgentMozilla/5.0 ...标识客户端类型(浏览器/设备) Acceptapplication/json声明接受的响应格式 Content-Typeapplication/json指定请求体的数据类型 AuthorizationBearer eyJhbGci...携带身份验证令牌 CookiesessionId=abc123发送服务器设置的 Cookie ExpiresWed, 21 Oct 2022 07:28:00 GMT强缓存指定资源的绝对过期时间Cache-Controlno-cache强缓存优先级高于Expires,常用指令:max-age=3600:缓存有效期(秒)。 -no-cache:跳过强缓存,直接进入协商缓存。 -no-store:禁止任何缓存(完全禁用缓存)。 -public:允许代理服务器缓存资源。 -private:仅允许客户端缓存资源。If-Modified-SinceWed, 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/htmlHTML页面 <html>...</html>application/jsonJSON数据 {"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-8text/htmlHTML 文档(网页内容) Content-Type: text/htmltext/cssCSS 样式表 Content-Type: text/csstext/csvCSV(逗号分隔值文件) Content-Type: text/csvtext/javascript(已过时)JavaScript 代码(推荐改用 application/javascript)旧代码可能仍在使用 应用类型 application/jsonJSON 格式数据,广泛用于 API 通信 Content-Type: application/json; charset=UTF-8application/xmlXML 格式数据 Content-Type: application/xmlapplication/x-www-form-urlencoded表单默认提交方式,数据编码为键值对(如 key1=value1&key2=value2)普通表单提交 multipart/form-data文件上传时使用,数据分多部分传输 Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryABC123application/octet-stream二进制流数据(如文件下载) 用于未知或任意二进制文件 application/pdfPDF 文件 Content-Type: application/pdfapplication/zipZIP 压缩文件 Content-Type: application/zip图像类型 image/jpegJPEG 图像 Content-Type: image/jpegimage/pngPNG 图像 Content-Type: image/pngimage/gifGIF 图像 Content-Type: image/gifimage/svg+xmlSVG 矢量图(基于 XML) Content-Type: image/svg+xml音视频类型 audio/mpegMP3 音频文件 Content-Type: audio/mpegvideo/mp4MP4 视频文件 Content-Type: video/mp4其他类型 application/javascriptJavaScript 代码 替代 text/javascriptapplication/ld+jsonJSON-LD(结构化数据格式) 用于语义网或 SEO 优化 application/vnd.ms-excelExcel 文件(旧版 .xls)Content-Type: application/vnd.ms-excelapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheetExcel 文件(新版 .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) **