Kratos HTTP 接口通过 proto 的 google.api.http 注解自动注册,需执行 make api 生成代码、启动服务并用 curl 验证;404 常因未生成 handler、注解错误或服务器未正确注册路由。

直接用 curl 或浏览器访问就行,前提是 Kratos 的 HTTP Server 已启动且路由已正确定义 —— 不需要额外“调用框架”,它本质就是个标准 HTTP 服务。
怎么确认接口已经暴露出来?
Kratos 的 HTTP 接口由 api/*.proto 文件定义,并通过 google.api.http 注解映射到具体路径。比如:
rpc SayHello (HelloRequest) returns (HelloReply) {
option (google.api.http) = { get: "/helloworld/{name}" };
}
生成代码后(make api),该接口就自动注册到 HTTP Server 上,路径为 GET /helloworld/kratos。
- 启动服务:
go run ./cmd/helloworld -conf configs/config.yaml - 检查日志:启动成功后会输出类似
HTTP server listening on [::]:8000 - 验证路由:执行
curl -v http://localhost:8000/helloworld/kratos,应返回 JSON 响应
为什么 curl 返回 404?常见原因
不是代码没写,而是 proto 定义、代码生成或服务配置三者之一断了链。
-
make api没执行,或执行失败(如缺少protoc-gen-go-http插件)→greeter_http.pb.go里没有对应 handler 注册逻辑 - proto 中
option (google.api.http)写错格式,比如漏掉get:或路径含非法字符 → 生成器静默跳过该路由 - HTTP Server 实例没启用,或
http.NewServer()调用时没传入正确路由选项 → 查看internal/server/http.go是否调用了srv.Handle()或srv.Group() - 端口被占或配置文件里
http.addr设成了127.0.0.1:8000,但你在 macOS/Linux 用localhost访问 → 改成0.0.0.0:8000更稳妥
怎么传参数?路径、查询、Body 各自怎么写
Kratos 会按 google.api.http 注解自动解析,不用手动 r.URL.Query().Get() 或 json.Decode()。
- 路径参数(Path):
get: "/hi/{name}"→ 请求GET /hi/abc,req.Name自动赋值为"abc" - 查询参数(Query):
get: "/search" body: "*"→ 请求GET /search?q=go&limit=10,需在HelloRequestmessage 里定义字段string q = 1;和int32 limit = 2; - 请求体(Body):
post: "/user" body: "*"→ 请求POST /user,Body 为 JSON,字段自动绑定到HelloRequest对应字段(要求字段名、类型、tag 匹配) - 混合使用也支持,比如
put: "/user/{id}" body: "*":路径取id,Body 解析其余字段
调试时看不到请求进来了?日志和中间件要开对
Kratos 默认不打详细 HTTP 日志,得显式启用 logging.Server() 中间件。
- 检查
internal/server/http.go中http.NewServer()是否传了http.Middleware(logging.Server(logger)) - 如果只看到 panic 或空响应,大概率是业务层 panic 导致未走到日志中间件 → 加上
recovery.Recovery()中间件捕获 panic - 注意:Kratos 的
logging.Server输出的是结构化日志(JSON 格式),别用fmt.Println查请求,它会被中间件日志覆盖或丢弃 - 想快速验证 handler 是否执行,可在 service 方法开头加
log.Printf("SayHello called with %s", req.Name)(仅临时调试)
最易被忽略的点:proto 修改后必须 make api,否则改了等于没改;而 make api 失败时往往静默跳过,只报错在终端末尾一行,容易漏看。


















