Kratos在service方法中获取header中的数据

719 阅读1分钟

一、背景和意义

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