一、背景和意义
kratos是go语言中常用的微服务框架,用于开发HTTP服务时,可能需要获取前端请求的header信息。kratos官方文档中关于如何获取header数据的例子隐藏得较深,对新手来说不太好找。文本提供一个获取前端请求的header信息的例子。
二、创建运行简单的kratos应用
执行如下命令安装kratos工具:
go install github.com/go-kratos/kratos/cmd/kratos/v2@latest
接下来创建一个简单项目:
kratos new kratos-demo -r https://gitee.com/go-kratos/kratos-layout.git
将相关依赖下载到本地:
go mod download
go mod tidy
生成代码:
go generate ./...
运行代码:
kratos run
用浏览器打开链接:http://localhost:8000/helloworld/kratos
。正常情况下会返回:{"message":"Hello kratos"}
其中该请求的处理方法位于internal/service/greeter.go
文件,相关代码如下:
// SayHello implements helloworld.GreeterServer.
func (s *GreeterService) SayHello(ctx context.Context, in *v1.HelloRequest) (*v1.HelloReply, error) {
g, err := s.uc.CreateGreeter(ctx, &biz.Greeter{Hello: in.Name})
if err != nil {
return nil, err
}
return &v1.HelloReply{Message: "Hello " + g.Hello}, nil
}
三、获取请求中的header数据
internal/service/greeter.go
文件内容修改如下:
// SayHello implements helloworld.GreeterServer.
func (s *GreeterService) SayHello(ctx context.Context, in *v1.HelloRequest) (*v1.HelloReply, error) {
tr, ok := transport.FromServerContext(ctx)
if !ok {
fmt.Println("获取header失败")
} else {
header := tr.RequestHeader()
fmt.Println("从header中获取的User-Agent信息: ", header.Get("User-Agent"))
}
g, err := s.uc.CreateGreeter(ctx, &biz.Greeter{Hello: in.Name})
if err != nil {
return nil, err
}
return &v1.HelloReply{Message: "Hello " + g.Hello}, nil
}
这里为了简单起见,仅使用fmt.Println打开日志,否则使用kratos中的日志还需要添加更多的代码。上面的代码中使用transport.FromServerContext方法获取请求header中数据,打印出的日志信息如下:
从header中获取的User-Agent信息: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36