客户端的 gRPC 上下文
gRPC context on the client side
我正在使用 gRPC 和 protobuf(以及通往 REST 的 gRPC 网关)构建一个 client/server 系统。
我在服务器端的上下文中使用 metadata 从客户端传输身份验证数据,效果非常好。
现在,我希望服务器设置一些元数据 keys/values 以便客户端可以获取它们以及响应。我怎样才能做到这一点?使用 SetHeader and SendHeader? Ideally, I'd like every single response from the server to integrate that metadata (can be seen as some kind of UnaryInterceptor,但基于响应而不是请求?)
我终于找到了方法:https://github.com/grpc/grpc-go/blob/master/Documentation/grpc-metadata.md
所以基本上,grpc.SetHeader()
+ grpc.SendHeader()
和 grpc.SetTrailer()
完全是我要找的。在客户端,需要将grpc.Header()
和grpc.Trailer()
函数传递给RPC调用,它们的参数是一个metadata.MD
待填充的对象
在客户端,定义您的接收元数据:
var header, trailer metadata.MD
然后,将其传递给 SomeRPCCall()
一元 RPC:
response, err := client.SomeRPCCall(
context.Background(),
proto.MyMessage{},
grpc.Header(&header),
grpc.Trailer(&trailer),
)
现在,您可以查看元数据中的内容:
for key, value := range header {
fmt.Printf("%s => %s", key, value)
}
for key, value := range trailer {
fmt.Printf("%s => %s", key, value)
}
在服务器端,您可以:
强制在收到 RPC 后立即发送数据(但在处理之前):
grpc.SendHeader(ctx, metadata.New(map[string]string{"my-key": "my-value"}))
或在 RPC 过程结束时设置并发送元数据(连同 Status
):
grpc.SetTrailer(ctx, metadata.New(map[string]string{"my-key": "my-value"}))
我正在使用 gRPC 和 protobuf(以及通往 REST 的 gRPC 网关)构建一个 client/server 系统。
我在服务器端的上下文中使用 metadata 从客户端传输身份验证数据,效果非常好。
现在,我希望服务器设置一些元数据 keys/values 以便客户端可以获取它们以及响应。我怎样才能做到这一点?使用 SetHeader and SendHeader? Ideally, I'd like every single response from the server to integrate that metadata (can be seen as some kind of UnaryInterceptor,但基于响应而不是请求?)
我终于找到了方法:https://github.com/grpc/grpc-go/blob/master/Documentation/grpc-metadata.md
所以基本上,grpc.SetHeader()
+ grpc.SendHeader()
和 grpc.SetTrailer()
完全是我要找的。在客户端,需要将grpc.Header()
和grpc.Trailer()
函数传递给RPC调用,它们的参数是一个metadata.MD
待填充的对象
在客户端,定义您的接收元数据:
var header, trailer metadata.MD
然后,将其传递给 SomeRPCCall()
一元 RPC:
response, err := client.SomeRPCCall(
context.Background(),
proto.MyMessage{},
grpc.Header(&header),
grpc.Trailer(&trailer),
)
现在,您可以查看元数据中的内容:
for key, value := range header {
fmt.Printf("%s => %s", key, value)
}
for key, value := range trailer {
fmt.Printf("%s => %s", key, value)
}
在服务器端,您可以:
强制在收到 RPC 后立即发送数据(但在处理之前):
grpc.SendHeader(ctx, metadata.New(map[string]string{"my-key": "my-value"}))
或在 RPC 过程结束时设置并发送元数据(连同
Status
):grpc.SetTrailer(ctx, metadata.New(map[string]string{"my-key": "my-value"}))