直接用curl测试kratos http接口最省事,服务启动后执行curl -v 'http://127.0.0.1:8000/helloworld/kratos'即可验证连通性与响应;若报connection refused,需检查kratos run日志、kratos.yaml中server.addr是否为0.0.0.0:8000且未被占用。

直接用 curl 测试 HTTP 接口最省事
Kratos 默认启一个 HTTP 服务(比如 0.0.0.0:8000),只要服务跑起来,curl 就能立刻验证接口是否通、返回是否符合预期。不需要额外装 UI 工具或写测试代码。
常见错误现象:curl: (7) Failed to connect to 127.0.0.1 port 8000: Connection refused —— 说明服务根本没起来,或 kratos.yaml 里 server.addr 配错了端口,或被防火墙/其他进程占用了。
- 确认服务已运行:
kratos run后看日志是否有类似start http server at [::]:8000 - 检查配置文件:
kratos.yaml中的server.addr必须是监听地址+端口,如0.0.0.0:8000,不能写成127.0.0.1:8000(Mac M1/M2 上某些版本会 bind 失败) - 简单测试命令:
curl -v 'http://127.0.0.1:8000/helloworld/kratos',加-v能看到完整请求头和状态码
用 grpcurl 测试 gRPC 接口必须指定 proto 文件路径
gRPC 接口不能靠 curl 直接调,因为它是二进制协议。Kratos 生成的 gRPC 服务默认监听 [::]:9000,但 grpcurl 没有服务端反射(reflection)时,必须显式传入 .proto 文件才能解析请求结构。
典型报错:Failed to list services: server does not support service reflection API —— 这不是服务挂了,而是 grpcurl 找不到接口定义。
- 确保
proto文件存在且路径正确,例如:api/helloworld/v1/greeter.proto - 调用命令示例:
grpcurl -plaintext -proto api/helloworld/v1/greeter.proto 127.0.0.1:9000 helloworld.v1.Greeter/SayHello - 如果提示找不到
helloworld.v1包,检查.proto文件中option go_package的值是否与实际 Go 包路径一致(如"helloworld/api/helloworld/v1;v1") - 不推荐在生产环境开启 reflection(需手动注册
grpc.ReflectionServer),开发阶段用-proto参数更可控
集成 Swagger UI 前要确认 HTTP 路由已注册 /swagger/*
Kratos 本身不自带 Swagger,需要手动接入第三方中间件(如 swaggo/http-swagger)。但很多人卡在“页面打开空白”或“404”,问题往往出在路由没挂对位置。
关键点:Swagger 静态资源必须挂载在 Kratos 的 HTTP Server 实例上,而不是随便 new 一个 mux 或 gin。
- 在
internal/server/http.go中,找到http.NewServer创建处,在其Handler注册前插入 swagger handler: srv.Handle("/swagger/*", httpSwagger.Handler(httpSwagger.URL("/swagger/doc.json")))- 确保项目根目录下有
doc.json(由swag init生成),且路径与 URL 中的/swagger/doc.json严格匹配 - 浏览器访问
http://127.0.0.1:8000/swagger/index.html,不是/swagger/或/docs
写单元测试时别直接调用 service 层函数
新手常把 internal/service/greeter.go 里的 SayHello 方法拿出来单独测,这绕过了 transport、middleware、binding 等真实链路,测了等于没测。
真正有效的接口测试,应该走完整的 HTTP 或 gRPC 入口,模拟真实请求流程。
- HTTP 测试建议用
httptest.NewServer启一个临时服务,再用http.DefaultClient发请求 - gRPC 测试优先用
bufconn(内存连接),避免启动真实网络端口,速度更快也更隔离 - 注意
kratos run和测试用的app.New初始化方式不同:测试中要手动注入 mock 的data.Repository,否则会连真实数据库 - 别忘了清理:gRPC 测试结束后调
server.Stop(),HTTP 测试后调ts.Close(),否则端口可能被占导致后续测试失败











