
作为一名全栈开发者,我每天都在和 API 打交道。前端开发等后端接口、第三方 API 限流、微服务联调......这些场景都需要 Mock 数据。
试过不少 Mock 工具,但总觉得差点意思:
于是我决定自己造轮子。目标很简单:
零依赖、单二进制、功能完整、高性能
三个月后,MockAPI 诞生了。
| 指标 | 数值 |
|---|---|
| 运行时依赖 | 0 |
| 安装方式 | go install 一条命令 |
| 启动时间 | < 100ms |
| 路由匹配性能 | 提升 24 倍 |
| 内存占用 | 减少 94% |
支持的功能:
选择 Go 不是因为我只会 Go (虽然这也有关系),而是它完美契合这个场景:
编译成单个二进制文件,用户不需要安装 Node.js 、JVM 或任何其他运行时。下载即用,上传即跑。
# 安装 go install github.com/fynntang/MockAPI@latest # 启动 mockapi serve # 完成! Go 的 net/http 性能优异,encoding/json 够用,embed 可以把 Web UI 嵌入二进制。不需要引入重型框架。
一次编译,到处运行:/p>
GOOS=darwin GOARCH=amd64 go build # macOS GOOS=linux GOARCH=amd64 go build # Linux GOOS=windows GOARCH=amd64 go build # Windows 没有复杂的依赖关系,不需要 Docker 也能轻松部署。当然,如果你喜欢容器化:
docker run -p 8088:8088 mockapi 项目初期,路由匹配是这样的:
// 线性搜索 O(n) func (s *Server) matchRoute(method, path string) *Route { for _, route := range s.routes { if route.Method == method && route.Match(path) { return route } } return nil } 当路由数量少时没问题,但随着功能增加,性能急剧下降:
100 个路由: ~500ns 1000 个路由: ~5ms 10000 个路由:~50ms // 不可接受! 我设计了一个两层索引结构:
┌─────────────────────────────────────────┐ │ RouteIndex │ ├─────────────────────────────────────────┤ │ exact: map["GET:/users"] -> Route │ ← O(1) ├─────────────────────────────────────────┤ │ param: map["GET:/users"] -> []Route │ ← O(k) │ map["GET:/posts"] -> []Route │ ├─────────────────────────────────────────┤ │ wildcard: map["GET"] -> []Route │ ← O(m) └─────────────────────────────────────────┘ 匹配逻辑:
优化前:BenchmarkRouteMatch-8 231218 5169 ns/op 6400 B/op 优化后:BenchmarkRouteMatch-8 5589621 214 ns/op 68 B/op 性能提升:24 倍 内存减少:94% 这就是算法优化的力量。没有黑魔法,只是把数据结构选对了。
支持 :param 参数和 * 通配符:
# routes.json - path: /users/:id method: GET response: body: | { "id": {{params.id}}, "name": "User {{params.id}}" } - path: /api/* method: ANY proxy: https://real-api.com 当静态响应不够用时,可以用 Javascript 动态生成:
// 条件响应 if (headers["x-api-key"] === "secret") { return { authorized: true, user: "admin" }; } // 模拟延迟 sleep(100); return { data: "delayed response" }; // 随机数据 return { id: Math.floor(Math.random() * 1000), name: faker.name(), email: faker.email() }; 有现成的 API 文档?一键导入:
mockapi import swagger.yaml 自动解析所有端点,生成 Mock 路由。
支持 Query 和 Mutation:
- operation: GetUser response: data: user: id: "1" name: "John" 模拟实时数据推送:
- path: /ws/chat messages: - delay: 1000 data: "Hello!" - delay: 2000 data: "How are you?" 不想写配置文件?打开浏览器就能管理:
http://localhost:8088/_ui 功能:
后端 API 还没好?自己 Mock:
# 1. 创建配置 mockapi init # 2. 添加路由(或用 Web UI ) # 3. 启动服务 mockapi serve # 4. 前端请求 http://localhost:8088/api/... 调用外部 API 有限流? Mock 它:
- path: /external/* proxy: https://api.external.com rateLimit: 10/s 未匹配的请求转发到真实 API ,匹配的返回 Mock 数据。
把 routes/ 目录加入 Git:
git add routes/ git commit -m "Add mock routes" 团队成员 git pull 后自动同步 Mock 数据。
| 特性 | MockAPI | MockServer | JSON Server | Postman Mock |
|---|---|---|---|---|
| 零依赖 | (JVM) | (Node.js) | (联网) | |
| 动态响应 | ||||
| GraphQL | ||||
| WebSocket | ||||
| gRPC | ||||
| Web UI | ||||
| 开源 |
# 安装 go install github.com/fynntang/MockAPI@latest # 启动 mockapi serve # 打开 Web UI open http://localhost:8088/_ui 就这么简单!
如果这个项目对你有帮助,欢迎 Star
开发 MockAPI 的过程让我学到了很多:
如果你也需要一个轻量级 Mock 服务器,不妨试试 MockAPI 。有问题或建议,欢迎在 GitHub 提 Issue !
Happy Mocking!