背景:一个卡了三天的联调事故
讲一个真实的联调翻车现场。
今年 3 月,我参与一个电商后台系统的前后端分离项目。后端 Leader 说:"接口文档先给你,你们前端照着接口文档开发,等后端联调的时候再接真的。" 我当时觉得挺正常的,这种模式干了七八年了。
结果接口文档写完发了过来,我一看——80 个接口,字段命名和文档对不上、枚举值文档写的是 0/1/2、实际返回是 'pending'/'processing'/'completed'、有些字段文档没写但前端在等……我统计了一下,文档和实际返回能完全对上的,只有 32 个。
后端说:"等联调再对,你先按文档写。" 前端说:"文档都不对,我写完了联调还得重写。" 两边就这么僵着,联调推迟了两周。那两周我白天开会,晚上自己搭了一套 Mock API,硬是把前端进度撑了起来。
这篇文章就是我这几年用 Mock API 的完整经验总结,包括我踩过的坑、各平台的实测数据、以及什么场景该用哪个方案。
Mock API 的本质是什么
先把这个概念说清楚。Mock API 是"模拟 API",它的作用是:在后端接口还没ready 的时候,模拟出一个和真实接口一样的响应,让前端可以提前开发,不用干等后端。
Mock API 分两种:
- 远程 Mock 服务:JSONPlaceholder、Mocky、HTTPBin 这种,你直接调人家的 URL,返回现成的数据。最快,但数据是固定的,不可定制。
- 本地 Mock 服务:Mockoon、msw、json-server 这种,你自己搭在本地的服务,可以完全自定义端点和响应格式。灵活,但需要一点配置成本。
这两种没有绝对的好坏,只有适合不适合。
四大主流免费 Mock API 实测对比
我把目前最常用的 4 个平台都测了一遍,测试维度:响应速度、稳定性、端点灵活性、数据真实性、适合场景。
1. JSONPlaceholder
JSONPlaceholder 是前端开发者圈子里知名度最高的 Mock API,没有之一。特点是数据真实、RESTful 设计规范、覆盖常见的 CRUD 场景。地址:jsonplaceholder.typicode.com
提供的端点:
GET /posts - 100 条帖子
GET /posts/1 - 单条帖子
GET /posts/1/comments - 某帖子的评论
GET /users - 用户列表
GET /albums - 相册列表
GET /photos - 照片列表
GET /todos - 待办列表真实响应示例:
{
"userId": 1,
"id": 1,
"title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
"body": "quia et suscipit\nsuscipit recusandae consequuntur ..."
}实测数据:
- P50 响应时间:110ms(走 Cloudflare CDN,全球节点覆盖)
- P95 响应时间:310ms
- 失败率(7 天持续测试):0.2%
- 支持 HTTPS:是
- CORS:支持
JSONPlaceholder 的优点是数据真实——它用的是Lorem Ipsum 的变体,标题和内容是能读出语义的句子,不是占位符乱码。这对前端开发很重要:你在写卡片布局的时候,需要的是真实长度的文本,这样 CSS 的 overflow、line-clamp 才能调对。
最大的局限是:数据是只读的。POST /posts 返回的状态码是 201,但数据并没有真的被创建。PUT /posts/1 返回的也不是你发过去的内容,而是服务器内置的假数据。如果你要测试"创建订单后订单状态正确显示",JSONPlaceholder 帮不了你。
2. Mocky
Mocky(mocky.io)是另一个流行的在线 Mock 工具,特点是:你可以自己定义返回的 JSON,然后得到一个专属 URL。地址:mocky.io
使用方法:打开 mocky.io 的网页,在编辑器里写 JSON,点 "Generate my HTTP Response",得到一个类似 https://www.mocky.io/v3/xxxxx 的 URL。
实测数据:
- P50 响应时间:180ms
- P95 响应时间:500ms
- 失败率(7 天测试):3.1%
- 数据定制:是
- 长期可用性:不确定(免费版服务不保证 SLA)
Mocky 的优势是你可以完全定制返回内容,包括字段名、嵌套结构、枚举值、数组长度。完全匹配你的接口文档,不用凑合用 JSONPlaceholder 的固定数据结构。
但 Mocky 有个很严重的问题:URL 变了,Mock 就丢了。你在这个网站上手写的 JSON,存储在 Mocky 的服务器上。如果你哪天清理了浏览器缓存,或者 Mocky 平台改版,这个 URL 可能就打不开了。我之前有个项目,前端接了 20 多个 Mocky 的 URL,后来有 3 个永久失效了,直到联调才发现前端代码里有一堆"https://www.mocky.io/v3/失效的ID"。
3. HTTPBin
HTTPBin(httpbin.org)不是传统意义上的 Mock API,它是一个"HTTP 请求测试与调试"工具。它的定位是"帮你测试 HTTP 请求是否正确发出",而不是"提供假数据"。
典型端点:
GET /get - 返回你发出的请求头和参数
POST /post - 返回你 POST 的内容
PUT /put - 返回你 PUT 的内容
DELETE /delete - 返回 DELETE 请求的确认
/ip - 返回请求来源 IP
/headers - 返回所有请求头
/status/418 - 返回 418 I'm a teapot
/delay/5 - 延迟 5 秒返回(测试超时处理)HTTPBin 的独特价值是那个 /delay/ 端点——你可以模拟网络延迟,用来测试前端的 loading 状态、超时处理、retry 逻辑。这个功能 JSONPlaceholder 和 Mocky 都做不到。
实测数据:
- P50 响应时间:280ms
- P95 响应时间:800ms
- 失败率:1.8%
- /delay/5 实际延迟:5.1-5.4s(准确)
- /delay/10 实际延迟:10.2-10.5s
HTTPBin 也有它的问题:它只返回"你发过去的内容",不是业务数据。比如你 POST 一个订单,HTTPBin 会原封不动地返回这个订单 JSON,但这不是真实业务逻辑——真实场景下,POST 一个订单返回的应该是服务器生成的新订单 ID、下单时间、初始状态。HTTPBin 做不到这个。
4. Beeceptor
Beeceptor(beeceptor.com)是一个更高级的 Mock 平台,特点是:你可以定义"规则",同一 URL 根据不同请求参数返回不同响应。地址:免费层提供 20 个端点。
// 定义一个带规则的反向代理
POST /api/orders
→ 当 body.status === 'pending' 时,返回 { id: 'ORD001', status: 'confirmed' }
→ 当 body.status === 'paid' 时,返回 { id: 'ORD001', status: 'shipped' }Beeceptor 最适合的场景是:测试同一个接口在不同业务状态下的表现。比如订单状态机,你不用改代码,只需要发不同的请求参数,就能看到每种状态下的响应。
实测数据:
- P50 响应时间:150ms(走 Cloudflare)
- 失败率:0.5%
- 免费层限制:20 个端点,每天 200 次请求
我的实战选型:从"能用"到"好用"的三层方案
经过多个项目的验证,我现在用 Mock API 的策略分三层:
第一层:快速原型 → JSONPlaceholder
刚拿到 UI 设计稿,还没开始写接口文档,我直接拿 JSONPlaceholder 的端点开始。比如一个社交 feed 页面,直接:
fetch('https://jsonplaceholder.typicode.com/posts?_limit=10')
.then(r => r.json())
.then(posts => posts.map(post => ({ ...post, avatar: `https://i.pravatar.cc/50?u=${post.userId}` })))加上 pravatar.cc 的随机头像 API,一个有真实头像的 feed 列表就出来了。这个阶段追求的是速度,数据结构是否完全准确不重要。
第二层:接口文档对齐 → Mocky + JSON Server 本地
当接口文档基本稳定(字段名、类型、嵌套结构定稿了),我就在本地起一个 json-server(一个 npm 包,零配置跑一个本地 REST API):
npm install -g json-server
# 在项目目录建一个 db.json
{
"products": [
{ "id": 1, "name": "iPhone 15", "price": 5999, "status": "published" }
]
}
# 启动服务
json-server --watch db.json --port 3001
# 现在你就有了一个完整的 REST API
GET http://localhost:3001/products
POST http://localhost:3001/products
PUT http://localhost:3001/products/1json-server 的好处是你可以完全自定义数据结构,同时支持 GET/POST/PUT/DELETE,所有增删改查的逻辑都有了。比 Mocky 稳定(因为跑在你自己的机器上),比纯硬编码更灵活(因为可以改 db.json)。
而且 json-server 还支持路由重写、过滤、排序、分页——/products?status=published&_sort=price&_order=desc 这种,真实 REST API 支持的操作它基本都有。
第三层:复杂业务逻辑 → MSW(Mock Service Worker)
当业务逻辑变复杂,简单的 Mock API 就不够用了。比如:同一个订单接口,你可能要测试"支付成功"、"支付失败"、"支付超时"、"库存不足"、"风控拦截"——这 5 种场景,每种返回的响应体完全不一样。
这时候我推荐 MSW(Mock Service Worker)。它不是简单的返回假数据,而是拦截真实的网络请求,在 Service Worker 层返回你定义的响应。前端代码完全不用改,只需要在开发环境加载 MSW 的 handler。
// handlers.js - 定义 mock 规则
import { http, HttpResponse } from 'msw';
export const handlers = [
http.post('/api/orders', async ({ request }) => {
const body = await request.json();
// 模拟不同场景
if (body.amount > 10000) {
return HttpResponse.json(
{ code: 'RISK_BLOCK', message: '交易金额过高,需要人工审核' },
{ status: 400 }
);
}
if (body.inventory < 1) {
return HttpResponse.json(
{ code: 'OUT_OF_STOCK', message: '库存不足' },
{ status: 409 }
);
}
// 正常场景
return HttpResponse.json({
orderId: 'ORD-' + Date.now(),
status: 'confirmed',
amount: body.amount,
});
}),
];这个方案的最大优势是:前端代码和 Mock 代码完全分离。前端写的是正常的 fetch('/api/orders'),到了生产环境关掉 MSW,直接走真实接口,不用改任何业务代码。
真实踩坑记录:Mocky 链接失效导致的半夜翻车
讲一个我亲身经历的教训。
2024 年底,我参与的一个海外电商项目,前端用 Mocky 搭了 30+ 个 Mock 端点。产品上线前,后端联调完成,所有接口切换到真实地址,Mocky 的那些 URL 就没人管了。
结果 3 个月后,我们要在 App 里加一个新功能,让一个新前端工程师去接一个老的 API 模块。他打开代码一看,引用了一堆 https://www.mocky.io/v3/xxxx 的地址,联调文档里只写了"这个模块的接口还没对接,你先看看代码里的 mock"。那个 mock 链接已经打不开了,代码里的 URL 形同虚设。这位新同学花了 2 天时间才搞清楚哪些接口是真的、哪些是假的。
教训:不要用线上 Mock 服务作为长生命周期的假数据源。Mocky 只适合临时 demo,不适合在项目代码里长期引用。长期 Mock 用 json-server 或 MSW,跑在自己的仓库里,跟着项目走,URL 变了代码里改,不存在链接失效的问题。
最终推荐:按项目阶段选工具
| 阶段 | 推荐工具 | 原因 |
|---|---|---|
| UI 原型 / Demo | JSONPlaceholder + Pravatar | 零配置,数据真实 |
| 接口文档稳定后 | json-server(本地)+ db.json | 自定义数据结构,Git 托管 |
| 复杂业务逻辑 | MSW | 拦截网络请求,支持各种响应场景 |
| 临时调试 / HTTP 验证 | HTTPBin | /delay/、/status/ 独一无二 |
| 一次性 Demo / PPT 演示 | Mocky | 5 分钟搭一个可用端点,用完即弃 |
| 团队协作 Mock | Postman Mock Server / Prism | 支持版本管理,团队共享 |
写在最后
Mock API 不是一个"能用就行"的东西,它的质量直接影响前端开发体验和联调效率。我见过太多项目因为 Mock 数据不真实、不稳定,导致前端在联调的时候大量返工。
一个好的 Mock 方案应该满足三个标准:数据结构真实(字段名、类型和真实接口完全一致)、响应场景完整(正常/错误/边界都要覆盖)、稳定性有保证(不会莫名其妙挂掉或链接失效)。
这三个标准按优先级排序的话,稳定性 > 数据结构真实 > 响应场景完整。如果 Mock 动不动就 500,它的"质量"毫无意义。
如果你是刚入门 Mock 开发,Free API Hub 上的 Mock API 分类收录了几个我上文提到的服务,都有完整的端点格式说明和调用示例,可以直接拿来练手。
好的开发体验,从好的 Mock 开始。别让"接口还没好"成为前端进度的拦路虎。