news 2026/8/16 6:45:50

Postman Mock Server实战:零代码构建API模拟服务,驱动前后端并行开发

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Postman Mock Server实战:零代码构建API模拟服务,驱动前后端并行开发

如果你正在开发一个前后端分离的项目,或者需要与第三方 API 对接,最头疼的瞬间是什么?大概率是后端接口还没开发完,或者第三方服务不稳定、有调用限制的时候。前端开发、移动端调试、自动化测试脚本全都卡在那里,整个团队的进度被一个“接口”给阻塞了。

这就是为什么我们需要Mock Server(模拟服务器)。它不是一个新概念,但很多开发者对它要么停留在“听说过”,要么就是简单用一下,没有发挥出它真正的威力。今天,我们不谈复杂的代码搭建,就用最流行、最轻量的 API 工具——Postman,来彻底解决这个痛点。

这篇文章要给你的,不是一个简单的“点击创建”教程。我会带你深入理解:为什么 Postman Mock Server 是中小团队和个人开发者的效率利器?它如何从“模拟数据”升级为“驱动开发流程”的关键环节?更重要的是,我会拆解从创建、配置到高级应用的完整路径,并提供你立刻就能复制的代码模板和排查清单,让你告别“等接口”的被动开发模式。

1. 这篇文章真正要解决的问题:从“阻塞等待”到“并行开发”

在传统的开发流程中,前后端约定好接口文档后,前端往往需要等待后端真正实现并部署好接口,才能开始联调。这个“等待期”造成了巨大的资源浪费。Mock Server 的核心价值,就是消除这种依赖,让并行开发成为可能

但很多开发者对 Mock 的理解有误区:

  • 误区一:Mock 就是随便返回个 JSON。这会导致后期联调时,因为数据格式、状态码、错误响应与真实接口不一致,产生大量返工。
  • 误区二:Mock 只能用于开发阶段。实际上,它在测试(尤其是自动化测试)、演示、文档编写等场景中同样不可或缺。
  • 误区三:搭建 Mock 环境很复杂。认为需要自己起一个 Node.js 或 Python 服务,增加了维护成本。

Postman Mock Server 的优势就在于,它完美避开了这些坑:

  1. 零成本搭建:无需服务器,无需写后端代码,在 Postman 界面内几分钟即可完成。
  2. 与文档强绑定:Mock 规则直接基于你已在 Postman 中定义好的请求(Collection)和响应示例(Example),保证了模拟数据与真实契约的一致性。
  3. 环境隔离与灵活性:可以为不同的环境(开发、测试)创建不同的 Mock Server,并支持根据请求参数、请求头等返回不同的动态响应。
  4. 团队协作友好:生成的 Mock URL 可以分享给整个团队的前端、测试甚至产品经理,所有人基于同一套“模拟真相”工作。

接下来,我们将从核心概念开始,一步步构建一个专业级的 Mock Server。

2. 基础概念与核心原理

在动手之前,我们先厘清几个关键概念,这能帮助你更好地理解后续的配置和高级用法。

Collection(集合):在 Postman 中,这是组织和管理一组相关 API 请求的容器。你可以把整个项目的 API,或者某个模块的 API,放在一个 Collection 里。Mock Server 总是关联到一个特定的 Collection。

Request(请求) & Example(示例):在 Collection 中,你定义的每一个 API 端点(如GET /api/users)就是一个 Request。而Example 是 Mock Server 的灵魂。你可以为一个 Request 添加多个 Example,每个 Example 定义了:当请求满足某些条件(如特定的查询参数、请求头、请求体)时,Mock Server 应该返回什么样的响应状态码、响应头和响应体。如果没有匹配的 Example,Mock Server 会使用该 Request 下保存的最新响应(如果有的话)或返回默认的 404 错误。

Mock Server(模拟服务器):Postman 为你生成的一个云端服务端点(一个唯一的 URL)。任何向这个 URL 发送的、路径匹配的 HTTP 请求,都会被 Postman 的云端服务拦截,并根据你配置的 Collection 和 Example 规则,返回预设的模拟响应。

Mock URL:形如https://your-unique-id.mock.pstmn.io的地址。你所有模拟请求都发往这个域名下的对应路径。

它们之间的关系可以用一个简单的流程图来理解:

用户请求 `GET https://xxx.mock.pstmn.io/api/users?active=true` ↓ Postman Mock 云端服务接收请求 ↓ 在关联的 Collection 中查找路径为 `/api/users` 的 Request ↓ 在该 Request 下,查找能匹配 `active=true` 这个查询参数的 Example ↓ 找到匹配的 Example,返回其中定义的响应(如 200 OK,用户列表 JSON) ↓ 如果未找到匹配的 Example,则返回该 Request 下保存的最后一个响应,或 404

3. 环境准备与前置条件

开始创建你的第一个 Mock Server 之前,请确保满足以下条件:

  1. Postman 账户:你需要一个免费的 Postman 账户。访问 Postman 官网 即可注册。
  2. Postman 桌面客户端或 Web 版:建议使用桌面客户端,功能更完整稳定。Web 版也能完成大部分操作。
  3. 一个已规划好的 API Collection:这是核心原材料。你不需要后端已经实现,但你需要提前在 Postman 中规划好你的 API 蓝图。
    • Collection 结构:建议按业务模块划分 Collections。例如,“用户中心”、“订单管理”、“商品服务”各建一个 Collection。
    • Request 定义:在 Collection 中,为每个 API 端点创建对应的 Request,并设置好正确的HTTP 方法(GET/POST/PUT/DELETE)请求路径(如/api/users。请求体、查询参数、请求头可以先按设计稿填上,即使后端还没定,这也能帮助前端明确调用方式。
  4. 清晰的 API 设计文档(可选但强烈推荐):虽然 Postman 可以替代部分文档功能,但有一份清晰的接口设计稿(包括字段说明、类型、是否必填等)会让你创建 Example 时事半功倍。

4. 核心流程拆解:五步创建你的 Mock Server

我们以一个简单的“用户管理系统”为例,创建两个 API:GET /api/users(获取用户列表)和GET /api/users/:id(获取单个用户)。

4.1 第一步:创建并完善你的 API Collection

打开 Postman,点击左侧边栏的 “+” 号或 “Collections” 标签页下的 “Create a new Collection”。

  1. 将 Collection 命名为用户服务 API
  2. 点击 “Add a request”,创建第一个请求。
    • 请求名:获取用户列表
    • 方法:GET
    • URL:{{baseUrl}}/api/users(这里{{baseUrl}}是一个变量,我们稍后会在 Mock Server 中配置它)
  3. 同样方法,创建第二个请求。
    • 请求名:获取用户详情
    • 方法:GET
    • URL:{{baseUrl}}/api/users/:id

你的 Collection 现在应该看起来像这样:

用户服务 API (Collection) ├── 获取用户列表 (GET {{baseUrl}}/api/users) └── 获取用户详情 (GET {{baseUrl}}/api/users/:id)

4.2 第二步:为每个请求添加响应示例(Example)

这是 Mock 数据准确性的关键。我们为“获取用户列表”添加一个成功的示例。

  1. 在 “获取用户列表” 请求的标签页中,点击右侧 “Examples” 旁边的 “+” 号。

  2. 在出现的 Example 编辑器中:

    • Example 名称成功 - 返回用户列表
    • Status Code200
    • Response Body:粘贴以下 JSON。注意格式和字段名要与你的设计一致。
    { "code": 0, "message": "success", "data": { "users": [ { "id": 1, "name": "张三", "email": "zhangsan@example.com", "active": true }, { "id": 2, "name": "李四", "email": "lisi@example.com", "active": false } ], "total": 2, "page": 1, "size": 20 } }
  3. 点击 “Save Example”。同样地,你可以添加更多示例,比如失败 - 无权限 (403)失败 - 服务器错误 (500)

  4. 为“获取用户详情”也添加一个示例:

    • Example 名称成功 - 返回用户详情
    • Status Code200
    • Response Body
    { "code": 0, "message": "success", "data": { "id": 1, "name": "张三", "email": "zhangsan@example.com", "active": true, "createdAt": "2023-10-01T08:00:00Z" } }

4.3 第三步:正式创建 Mock Server

现在,基于这个准备好的 Collection 来创建 Mock Server。

  1. 在左侧边栏,找到你的用户服务 APICollection,点击右侧的 “...” 更多按钮。
  2. 选择 “Mock with”。
  3. 在弹出的配置窗口中:
    • Mock server name:给你的 Mock Server 起个名字,如用户服务-开发环境
    • Select a collection or fork:应该已经自动选中了你的用户服务 API
    • Environment (optional):可以关联一个已有的环境,用于管理变量。我们先跳过。
    • Make this mock server private:免费账户只能创建有限的公开 Mock Server。如果涉及敏感数据,建议升级或确保数据脱敏。这里我们保持取消勾选(公开)。
    • Save the mock server URL as an environment variable这是一个极其有用的功能!勾选它,并给你的环境变量起个名字,比如mock_base_url。Postman 会自动创建一个新的环境,并将生成的 Mock Server URL 保存到这个变量中。这样,你 Collection 里使用的{{baseUrl}}就会自动指向这个 Mock URL。
  4. 点击Create Mock Server

4.4 第四步:获取并使用你的 Mock URL

创建成功后,Postman 会弹出一个窗口,显示你的 Mock Server 详情。最重要的信息就是Mock Server URL,格式如https://xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.mock.pstmn.io

同时,如果你上一步勾选了保存为环境变量,Postman 会自动切换到一个名为用户服务 API Mock Server Environment的新环境。你可以在右上角的环境选择器中看到它。

现在,回到你的获取用户列表请求。因为 URL 中使用了{{baseUrl}},并且当前环境变量mock_base_url的值就是你的 Mock URL,所以请求的完整 URL 会自动变成了https://你的Mock域名.mock.pstmn.io/api/users

4.5 第五步:发送你的第一个 Mock 请求

确保右上角的环境选择器选中了你的 Mock 环境(例如用户服务 API Mock Server Environment)。

  1. 点击获取用户列表请求。
  2. 点击 “Send” 按钮。
  3. 查看响应区域。你应该立刻收到我们在第二步中定义的、那个包含张三和李四的 JSON 响应,状态码为 200。

恭喜!你的第一个 Mock Server 已经成功运行。前端开发者现在就可以将这个 Mock URL 作为他们的 API 基础地址,开始开发了。

5. 完整示例与高级配置实战

基础的 Mock 已经能解决80%的问题。但要应对更复杂的场景,我们需要一些高级技巧。

5.1 使用动态变量生成随机数据

Postman 内置了强大的动态变量(Dynamic Variables),可以在响应体中生成随机数据,让模拟数据更真实。

修改获取用户列表的成功示例的响应体:

{ "code": 0, "message": "success", "data": { "users": [ { "id": "{{$randomInt}}", "name": "{{$randomFullName}}", "email": "{{$randomExampleEmail}}", "active": true }, { "id": "{{$randomInt}}", "name": "{{$randomFullName}}", "email": "{{$randomExampleEmail}}", "active": false } ], "total": 100, "page": 1, "size": 20 } }

每次请求返回的用户名和邮箱都会是随机的。Postman 提供了数十种动态变量,如{{$guid}}(生成UUID)、{{$timestamp}}(时间戳)、{{$randomCity}}等。

5.2 基于请求参数返回不同响应(条件匹配)

这是 Mock Server 最强大的功能之一。我们可以让同一个/api/users接口,根据不同的查询参数返回不同的结果。

  1. 获取用户列表请求下,再添加一个新的 Example。
  2. Example 名称成功 - 返回活跃用户
  3. Request部分,填写你想要匹配的条件。例如,在 “Query Params” 标签页下,添加一个参数:
    • Key:active
    • Value:true
  4. Response部分,设置状态码为200,并编写一个只包含活跃用户的响应体。
{ "code": 0, "message": "success", "data": { "users": [ { "id": 101, "name": "活跃用户A", "email": "active.a@example.com", "active": true } ], "total": 50, "page": 1, "size": 20 } }
  1. 保存这个 Example。

现在,当你向 Mock Server 发送GET /api/users?active=true时,它会匹配到这个新的 Example,返回活跃用户列表。而发送GET /api/users(不带参数)则会匹配到最早创建的那个通用示例。

匹配优先级:Postman Mock Server 会按照 Example 在列表中出现的顺序进行匹配,使用第一个完全匹配的 Example。你可以拖动 Example 来调整顺序。

5.3 模拟延迟和网络错误

真实的网络请求会有延迟,甚至失败。Mock Server 可以模拟这些情况。

  1. 在 Example 的响应部分,点击 “Headers” 标签。
  2. 添加一个特殊的响应头:x-mock-response-code
  3. 设置其值为你想要模拟的 HTTP 状态码,例如500
  4. 在响应体中填写对应的错误信息 JSON。
{ "code": 5001001, "message": "Internal Server Error: Database connection failed.", "data": null }
  1. 要模拟延迟,可以添加另一个响应头:x-mock-response-delay。其值是以毫秒为单位的延迟时间,例如3000表示延迟3秒。

当请求匹配到这个 Example 时,Mock Server 会等待3秒,然后返回500状态码和错误信息。

5.4 在代码中调用 Mock API

前端、移动端或测试脚本如何调用?非常简单,只需将 API 的基础地址替换为你的 Mock URL。

JavaScript (Fetch API) 示例:

// 将 baseURL 替换为你的 Mock Server URL const MOCK_BASE_URL = 'https://your-unique-id.mock.pstmn.io'; async function fetchUserList() { try { const response = await fetch(`${MOCK_BASE_URL}/api/users`); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } const data = await response.json(); console.log('用户列表:', data); return data; } catch (error) { console.error('获取用户列表失败:', error); } } // 调用带参数的请求 async function fetchActiveUsers() { const response = await fetch(`${MOCK_BASE_URL}/api/users?active=true`); // ... 处理响应 }

Axios 示例:

import axios from 'axios'; const mockApi = axios.create({ baseURL: 'https://your-unique-id.mock.pstmn.io', timeout: 10000, }); // 在 Vue/React 组件或任何地方使用 mockApi.get('/api/users') .then(response => { console.log(response.data); }) .catch(error => { console.error(error); });

6. 运行结果与效果验证

创建并配置好 Mock Server 后,验证其是否按预期工作是关键。

  1. 基础功能验证

    • 在 Postman 中,直接发送 Collection 里的请求,观察返回的响应体、状态码是否与你定义的 Example 一致。
    • 检查响应头是否包含了你在 Example 中设置的Content-Type: application/json等。
  2. 条件匹配验证

    • 针对同一个请求,使用不同的参数、请求头或请求体进行多次发送。
    • 验证 Mock Server 是否正确地返回了匹配的 Example 响应。例如,发送带active=true参数和不带参数的GET /api/users,应该得到两个不同的结果。
  3. 外部调用验证

    • 打开浏览器,直接在地址栏输入你的 Mock URL(如https://xxx.mock.pstmn.io/api/users)。你应该能看到返回的 JSON 数据。
    • 使用curl命令在终端测试:
    curl -X GET "https://your-unique-id.mock.pstmn.io/api/users"
    • 在你的前端项目或测试脚本中,将 API 地址指向 Mock URL,运行程序看是否能正常获取数据。
  4. 动态变量验证

    • 多次调用同一个 Mock 接口,检查响应中使用了{{$randomFullName}}等动态变量的字段,其值是否每次都在变化。

如果以上验证都通过,说明你的 Mock Server 已经配置成功,可以投入使用了。

7. 常见问题与排查思路

在实际使用中,你可能会遇到以下问题。这里提供一份快速排查指南。

问题现象可能原因排查方式解决方案
请求返回 404 Not Found1. Mock Server 未关联到正确的 Collection。
2. 请求的 HTTP 方法或路径与 Collection 中的 Request 不匹配。
3. Collection 中该 Request 下没有任何 Example 或保存的响应。
1. 检查 Mock Server 配置页,确认其关联的 Collection 是否正确。
2. 在 Postman 中打开关联的 Collection,仔细核对请求方法和路径(注意大小写和路径参数)。
3. 检查该 Request 下是否有已保存的 Example。
1. 重新配置 Mock Server 的关联。
2. 在 Collection 中创建或修正对应的 Request。
3. 为该 Request 添加至少一个 Example。
返回的数据不是最新的 Example1. 可能匹配到了其他条件更宽松的 Example。
2. 浏览器或客户端缓存了旧的响应。
1. 检查请求的 URL、参数、头是否完全符合你期望的 Example 的匹配条件。Mock Server 按 Example 列表顺序匹配第一个成功的。
2. 在 Postman 中禁用缓存(在请求设置中),或在浏览器中打开开发者工具,禁用缓存并刷新。
1. 调整 Example 的顺序,或将更具体的 Example 上移。
2. 使用Ctrl+F5强制刷新,或在请求头中添加Cache-Control: no-cache
动态变量{{$randomInt}}没有生效1. 在响应体编辑器中,动态变量被错误地包裹在引号里,变成了字符串。
2. 使用了不被 Mock Server 支持的内置变量。
1. 检查响应体 JSON,确保动态变量是作为值的一部分,而不是被引号包围的字符串键。
2. 查阅 Postman 官方文档,确认该变量在 Mock 上下文中可用。
1. 正确格式:"id": {{$randomInt}}(无引号)。错误格式:"id": "{{$randomInt}}"
2. 使用{{$guid}},{{$timestamp}},{{$randomFullName}}等常用变量。
模拟延迟或特定状态码不生效1. 特殊的响应头(如x-mock-response-delay)名称拼写错误。
2. 响应头添加的位置不对(应在 Example 的响应部分添加)。
1. 在 Example 的响应 Headers 标签页中,仔细检查头名称和值。
2. 确认你修改的是 Example 的响应,而不是原始请求的响应。
1. 确保头名称拼写完全正确,全小写,用连字符连接。
2. 在正确的 Example 编辑界面中添加这些头。
团队其他人无法访问 Mock URL1. Mock Server 被设置为私有(Private),而对方不是你的 Postman 团队成员。
2. 网络策略限制(如公司防火墙)。
1. 检查 Mock Server 的配置,查看其可见性。
2. 让对方在浏览器中直接访问 Mock URL 看是否通。
1. 如果是公开项目,创建公开 Mock Server。如果需要控制权限,邀请对方加入你的 Postman 工作区(Workspace)。
2. 联系网络管理员。

8. 最佳实践与工程建议

将 Mock Server 融入你的开发生命周期,遵循以下最佳实践,可以最大化其价值。

  1. Collection 即文档,文档即契约

    • 将 Postman Collection 作为团队唯一的 API 设计文档。所有接口的变更,首先在 Collection 中更新 Request 和 Example。
    • 为每个 Request 添加清晰的描述,为每个字段添加注释(在请求体或响应体的 Raw 模式下,使用///* */)。
  2. Example 设计要全面

    • 不要只做“成功200”的示例。为每个重要的业务场景和异常情况都创建 Example。
    • 必须包含的示例类型:成功响应(200/201)、验证失败(400)、权限不足(401/403)、资源不存在(404)、服务器错误(500)、业务逻辑错误(自定义 code)。
    • 示例的响应体结构(特别是code,message,data这类通用包装字段)必须与后端实际实现严格一致。
  3. 善用环境变量管理多环境

    • 创建不同的环境,如开发-Mock开发-真实测试环境生产环境
    • 在每个环境中定义baseUrl变量,分别指向 Mock Server URL、开发服务器地址、测试服务器地址等。
    • 开发时,在 Postman 右上角切换环境即可切换调用目标,无需修改请求 URL。
  4. 版本化你的 Collection

    • 当 API 发生重大变更时,不要直接修改现有的 Collection。使用 Postman 的 “Fork” 功能创建一个新版本,或者通过 “导出” 进行备份。
    • 为不同的 API 版本创建不同的 Mock Server,方便前端进行兼容性测试。
  5. 将 Mock 集成到 CI/CD 流程

    • 在自动化测试(如使用 Newman,Postman 的命令行工具)中,可以首先针对 Mock Server 运行测试套件,快速验证前端逻辑是否正确,而无需依赖不稳定的后端服务。
    • 这能保证在联调前,双方对接口契约的理解是一致的。
  6. 安全与清理

    • 公开的 Mock Server 不要返回真实的敏感数据(如真实用户ID、手机号、密码哈希)。务必使用脱敏的假数据。
    • 定期清理不再使用的 Mock Server,避免在免费账户下达到数量限制。

9. 总结与后续学习方向

通过本文,你应该已经掌握了在 Postman 中创建和使用 Mock Server 的完整流程。我们从“为什么需要 Mock”这个根本痛点出发,不仅完成了从零到一的搭建,更深入到了条件匹配、动态数据、模拟异常等高级应用,并提供了详实的代码示例和问题排查清单。

核心收获

  • Mock Server 的本质是“契约驱动开发”:它迫使前后端在开发早期就明确接口规范,并以可执行的形式(Example)固定下来,这是减少联调摩擦的关键。
  • Postman Mock 的核心优势是“一体化”:它与你已有的 API 设计、测试工具无缝集成,无需维护另一套 Mock 代码或配置。
  • 高级功能让模拟更真实:动态变量和条件匹配让 Mock 数据不再是静态的“死数据”,能更好地覆盖各种测试场景。

接下来你可以做什么

  1. 探索 Postman Monitors:为你的 Mock Server 设置定时监控,检查其可用性,这对于长期项目很重要。
  2. 学习 Newman:将你的 Collection 和测试用例通过命令行集成到 Jenkins、GitLab CI 等自动化流程中。
  3. 研究更复杂的响应模拟:例如,使用 Postman 的预请求脚本和测试脚本,在 Example 中编写 JavaScript 逻辑来生成更复杂的动态响应。
  4. 对比其他 Mock 方案:当你和团队的需求增长,可以了解像json-serverMock.jsYApiSwagger UI等工具的优缺点,选择最适合你们技术栈和流程的方案。

现在,立刻打开你的 Postman,为你正在卡进度的项目创建一个 Mock Server。你会发现,等待接口的时间,立刻变成了并行开发的效率。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/16 6:44:42

从CAM到基础模型:视觉可解释性方法演进与实战指南

1. 从CAM到基础模型:可解释性方法的核心脉络与实战价值如果你正在处理图像分类、目标检测或分割任务,并且模型预测结果让你感到困惑——比如,模型为什么把一只猫识别成了狗,或者它到底关注了图像的哪个区域才做出了判断——那么&a…

作者头像 李华
网站建设 2026/8/16 6:41:44

AI Agent核心架构解析:从LLM到工具调用的智能系统构建

在实际 AI 项目开发中,我们经常遇到这样的困境:大语言模型(LLM)虽然能理解指令并生成文本,但它无法直接操作数据库、调用外部 API 或执行一个需要多步骤决策的复杂任务。这时,AI Agent 的概念便应运而生。它…

作者头像 李华
网站建设 2026/8/16 6:41:31

小龙虾烹饪全攻略:从挑选处理到经典口味制作

1. 从“技能”到“手艺”:重新定义小龙虾烹饪最近刷到不少“小龙虾skills安装”的梗,乍一看以为是某个新出的软件包或者游戏模组,点进去才发现,大家讨论的其实是做小龙虾的“手艺”。这个说法挺有意思,把烹饪这种需要动…

作者头像 李华
网站建设 2026/8/16 6:34:00

Redis Stack 部署与核心功能实战指南:从Docker安装到生产环境优化

1. 项目概述:为什么选择Redis Stack?如果你正在寻找一个既能当缓存,又能当数据库,还能处理JSON文档、全文搜索和时序数据的“瑞士军刀”,那Redis Stack可能就是你的答案。它不是一个全新的产品,而是将Redis…

作者头像 李华
网站建设 2026/8/16 6:32:46

知识付费系统开发如何助力企业打造在线培训平台?

随着企业数字化培训需求不断增加,传统的线下培训方式在课程管理、员工学习、考试考核和培训数据统计等方面逐渐暴露出一些局限。通过开发知识付费系统,可以将企业课程、员工学习、在线考试、培训资料和学习数据集中到一个平台中,为企业建立更…

作者头像 李华
网站建设 2026/8/16 6:25:03

SSL证书部署全指南:从原理到实践,构建网站安全基石

你有没有过这样的经历:打开一个网站,浏览器地址栏突然跳出刺眼的红色警告,告诉你“连接不安全”?或者,在某个需要输入密码的页面,心里总隐隐觉得不踏实,担心自己的信息在传输中被“看光”&#…

作者头像 李华