仿真环境搭建:Mock Server概念、搭建简易Mock服务、配置代理转发
好,咱们进入第二章。说实话,很多同学在接口联调时最头疼的问题就是——后端还没写好,前端没法测;前端写好了,后端接口又经常挂。嗯,这时候你就需要Mock Server了。
我个人习惯把Mock Server叫做“接口替身”。它不干真正的业务逻辑,只负责按你设定的规则返回数据。说白了,就是让前后端开发能并行跑起来,谁也不等谁。
Mock Server到底是什么?
先别急着敲代码,咱们把概念理清楚。
Mock Server是一个模拟服务。它接收HTTP请求,然后根据你配置的规则返回预设的响应。比如你定义一个接口 /api/user/info,它收到GET请求后就返回一段JSON:
{
"code": 0,
"data": {
"name": "张三",
"age": 28
},
"msg": "success"
}
就这么简单。但它的价值可不小——
- 解耦开发:前端不用等后端接口写好就能开始联调
- 模拟异常:你可以轻松模拟超时、500错误、空数据等边界情况
- 稳定测试:不受真实环境网络波动、数据变更的影响
核心要点:Mock Server不关心业务逻辑,它只关心“请求长什么样,就返回什么数据”。
我在项目中遇到过好几次这样的情况:后端接口还在开发中,但前端已经需要展示页面了。如果没有Mock Server,前端只能写死数据,等后端好了再改——那叫一个痛苦。有了Mock,前端直接调Mock接口,等后端上线后改个baseURL就行。
搭建简易Mock服务:Flask vs FastAPI
现在咱们动手搭一个。我个人推荐用FastAPI,因为它性能好、自带文档、写起来也顺手。但如果你团队里有人更习惯Flask,那也行。我两个都讲一下,你根据情况选。
方案一:用Flask搭Mock
Flask轻量、简单,适合快速上手。先装依赖:
pip install flask
然后写一个最简单的Mock服务:
from flask import Flask, jsonify
app = Flask(__name__)
# 模拟用户信息接口
@app.route('/api/user/info', methods=['GET'])
def get_user_info():
return jsonify({
"code": 0,
"data": {
"name": "张三",
"age": 28
},
"msg": "success"
})
# 模拟登录接口
@app.route('/api/user/login', methods=['POST'])
def login():
return jsonify({
"code": 0,
"data": {
"token": "mock_token_123456"
},
"msg": "登录成功"
})
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000, debug=True)
启动后访问 http://localhost:5000/api/user/info,就能看到返回的JSON了。
小技巧:Flask的debug模式会自动重载代码,你改了Mock数据后不用重启服务,很方便。
方案二:用FastAPI搭Mock
FastAPI更现代,支持异步,而且自带Swagger文档。我个人更偏爱它。先装依赖:
pip install fastapi uvicorn
写一个同样的Mock服务:
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
# 模拟用户信息接口
@app.get('/api/user/info')
def get_user_info():
return {
"code": 0,
"data": {
"name": "张三",
"age": 28
},
"msg": "success"
}
# 模拟登录接口
class LoginRequest(BaseModel):
username: str
password: str
@app.post('/api/user/login')
def login(req: LoginRequest):
return {
"code": 0,
"data": {
"token": "mock_token_123456"
},
"msg": "登录成功"
}
if __name__ == '__main__':
import uvicorn
uvicorn.run(app, host='0.0.0.0', port=8000)
启动后访问 http://localhost:8000/docs,你会看到自动生成的API文档页面。嗯,这个功能在联调时特别有用——前端可以直接在页面上测试接口。
注意:Mock服务只用于开发和测试环境。千万别把它部署到生产环境,否则数据全是假的,用户会骂娘的。
配置代理转发
Mock服务搭好了,但前端怎么把请求转发过来呢?这就涉及到代理转发了。
你想想看,前端代码里写的是 /api/user/info,但真实后端地址可能是 http://real-backend:8080,而Mock地址是 http://localhost:5000。总不能每次都改代码吧?
所以我们需要一个代理工具,根据条件把请求转发到不同的目标。
方式一:前端代理(以Vue为例)
如果你用Vue开发,可以在 vue.config.js 里配置代理:
module.exports = {
devServer: {
proxy: {
'/api': {
target: 'http://localhost:5000', // Mock服务地址
changeOrigin: true,
pathRewrite: { '^/api': '/api' }
}
}
}
}
这样前端发起的 /api/xxx 请求,都会被转发到Mock服务。等后端接口写好了,你只需要把 target 改成真实后端地址就行。
方式二:使用Nginx做反向代理
如果你需要更灵活的转发规则,或者要模拟多个后端服务,Nginx是更好的选择。我曾经在一个项目里同时Mock了三个微服务,全靠Nginx搞定。
server {
listen 80;
server_name mock.example.com;
# 转发到Mock服务
location /api/user {
proxy_pass http://localhost:5000;
}
location /api/order {
proxy_pass http://localhost:5001;
}
# 其他请求转发到真实后端
location / {
proxy_pass http://real-backend:8080;
}
}
这样配置后,/api/user 走Mock,/api/order 走另一个Mock,其他请求走真实后端。非常灵活。
避坑指南:我曾经犯过一个错——把Mock和真实服务的端口搞混了。调试了半天才发现请求打到了Mock上,但Mock里没有这个接口,一直返回404。所以建议你在Mock接口的返回数据里加一个字段,比如 "source": "mock",方便区分。
知识体系总览
下面这张图帮你理清本章的核心逻辑:
总结一下
这一章我们做了三件事:
- 理解了Mock Server的概念——它就是个接口替身,让前后端能并行开发
- 动手搭了Mock服务——Flask和FastAPI两种方案,你选一个喜欢的就行
- 配置了代理转发——让前端请求能自动路由到Mock服务,不用改代码
嗯,到这里你已经有了一个可用的仿真环境。下一章咱们会在这个基础上,把Mock数据做得更智能——比如根据请求参数动态返回不同数据,或者模拟延迟、超时等场景。到时候你会发现,Mock Server能做的事情远比你想的要多。
个人建议:刚开始做Mock时,别想着一次把所有接口都Mock完。先Mock核心接口,等联调通了再逐步补充。我见过有人花了两天时间Mock了50个接口,结果第三天后端接口改了,全部白做——得不偿失。
可可精品资料库