资讯详情

gRPC-09 传递header信息/元数据 [golang版]

代码地址

https://github.com/wanmei002/grpc-learn/tree/master/ch08 逻辑在拦截器中实现,可以直接查看 拦截器 的代码

介绍

像一些 token 等数据 我们可能想通过 header头传递,gRPC先传输数据 context 里,然后再写到 header 头里,然后 传递给另一端。

直接上代码

客户端

header 数据的写入

需要导入 google.golang.org/grpc/metadata 这个包

headerData := metadata.Pairs("timestamp", strconv.Itoa(int(time.Now().Unix())), "token", "123") ctxH := metadata.NewOutgoingContext(ctx, headerData) // 以后也可以添加数据 ctxH = metadata.AppendToOutgoingContext(ctxH, "kay1", "val1", "key2", "val2") 

ctxH是上下文,请求服务端时,传输 context.Context 替换成 ctxH 就行

读取 header 信息

header 也可以通过头部信息 trailer 传递

读取一元模式 header 信息
var header, trailer metadata.MD // 调用服务端方法时,可以在后面传输参数 serverRetMsg, err := client.RPCMethod(ctx, &Struct, grpc.Header(&header), grpc.Trailer(&trailer)) 
流模式读取 header 信息
stream, err := client.RequestServerStreamMethod(ctx) header, err := stream.Header() trailer := stream.Trailer() 
<3>
服务端

header 头信息的写入

一元模式 数据的写入
header := metadata.Pairs("token", "123")
grpc.SendHeader(ctx, header)
trailer := metadata.Pairs("is-end", "end")
grpc.SetTrailer(ctx, trailer)
流模式 数据的写入

跟一元的一样,服务端提供的方法传进来的流参数里面有相关的方法

header := metadata.Pairs("token", "123")
stream.SendHeader(ctx, header)
trailer := metadata.Pairs("is-end", "end")
stream.SetTrailer(ctx, trailer)

header 头信息的读取

一元模式 数据的读取
md, ok := metadata.FromIncomingContext(ctx)
流模式 数据的读取
md, ok := metadata.FromIncomingContext(stream.Context())

标签: header11连接器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台