用net/http起mock server只需5行代码,关键在于路径、方法、响应结构、cors和content-type全对齐真实接口,确保前端不改代码即可无缝切换。

用 net/http 起一个能被前端直接访问的 Mock Server
别碰框架,net/http 五行代码就能跑起来,关键不是“搭服务”,而是“让前端不改一行代码就能切过去”。真实接口路径、方法、响应结构、CORS、Content-Type,全得对齐。
-
http.HandleFunc注册路径时别写死/api/user/123,用/{id}或直接解析r.URL.Path,否则前端带参数的请求直接 404 - 响应头必须设
Content-Type: application/json; charset=utf-8,否则fetch可能返回空response.json()报错 - 加
w.Header().Set("Access-Control-Allow-Origin", "*"),不然浏览器连预检请求都过不去,根本看不到后端返回 - 端口选
8080或3001,避开后端常用端口(比如8081),避免启动冲突 - 用
w.WriteHeader(http.StatusUnauthorized)控制状态码,别只靠fmt.Fprint(w, ...),否则前端收不到 401
前端怎么无缝切换到你的 Mock 接口
改前端代码里的 URL 是最危险的操作——上线漏切回真实地址,等于埋雷。唯一安全的方式是靠网络层劫持,而不是业务逻辑里写条件判断。
- 用本地
/etc/hosts把真实域名(比如api.example.com)指向127.0.0.1,Mock Server 监听:80(需 root)或:8080后配反向代理 - Webpack/Vite 开发服务器配
proxy:把所有/api/**请求转发到http://localhost:8080,不用改任何 JS - 绝对不要在前端代码里写
if (process.env.NODE_ENV === 'development')切地址——环境变量可能随构建产物一起发布,导致线上请求发到 localhost - 验证是否生效:用
curl -v http://localhost:8080/api/user?id=1看响应头和 body 是否符合预期,再开浏览器调试
为什么不能用 httptest.Server 做联调
httptest.Server 是给单元测试用的,不是给联调用的。它一跑完就销毁,且无法被外部进程稳定访问。
Go 配置库,使用 spf13/viper — 分层优先级(flag > env >file > KV > default),提供 BindPFlag/BindPFlags、SetEnvPrefix + SetEnvKeyReplace 等功能。
-
httptest.NewServer返回的 URL 是随机端口(如http://127.0.0.1:56789),前端没法硬编码,每次运行都变 - 它默认不处理 CORS,也不支持长连接、流式响应、多并发等真实 HTTP 场景
- 生命周期绑定在单个
test函数内,Postman、浏览器、Vue Devtools 都连不上 - 如果你看到有人用它做联调,大概率是误用了——那是测试辅助工具,不是 Mock Server
mockgen / testify/mock 适合什么场景
这些是给单元测试用的,不是给接口联调用的。它们 mock 的是 Go 代码里的接口调用,不是 HTTP 接口本身。
-
mockgen生成的是实现了某个UserRepository接口的 struct,用于替换数据库依赖,和前端无关 -
testify/mock的On("GetUser").Return(...)是在测试函数里控制被测函数内部调用行为,不是暴露 HTTP 端点 - HTTP 层的模拟,永远优先用
net/http+ 手动路由;只有当你需要测试“调用第三方 API 的 service 层”时,才用gomockmock 客户端接口 - 如果强行用
gomock模拟 HTTP handler,会绕过整个 HTTP 协议栈,失去 header、query、body 解析等真实交互逻辑
真正容易被忽略的点是:Mock Server 不是“返回 JSON 就完事”,而是要覆盖真实链路的所有毛细血管——超时、鉴权失败、分页参数校验、空数组、字段缺失、重定向跳转。这些全靠手动读 r.URL.Query()、r.Header.Get("Authorization")、r.Method 和写 w.WriteHeader 控制,没有捷径。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










