如何为一元 rpc 定义响应标头
Posted
技术标签:
【中文标题】如何为一元 rpc 定义响应标头【英文标题】:How to define response headers for unary rpc 【发布时间】:2018-02-05 21:06:44 【问题描述】:在 Go 中,我想从我的 rpc 处理程序实现中设置一些响应标头。具体来说,我想设置一些与缓存控制相关的标头。
但是,当 rpc 被定义为一元响应时,protoc 生成的方法签名只包含请求上下文和请求消息。这与从流式响应生成的代码形成对比,后者包括请求消息和grpc.ServerStream
。
这是一个由protoc生成的示例接口:
type CmsServer interface
GetPost(context.Context, *PostRequest) (*Post, error)
GetPosts(*GetPostsOptions, Cms_GetPostsServer) error
在示例中,GetPosts
包含 Cms_GetPostsServer
参数,这是一个 grpc.ServerStream
,它似乎包含设置自定义响应标头 https://godoc.org/google.golang.org/grpc#ServerStream 的方法(我还没有尝试过,如果这是错误的,请纠正我)。
同时,GetPost
似乎无法通过查看方法签名来设置响应标头(context.Context 只是请求上下文,而不是响应上下文)。那么如何为一元响应设置自定义响应标头?
【问题讨论】:
你确定那是确切的界面吗?所有方法的末尾通常都有一个可变参数集CallOptions
(opts ...grpc.CallOption
)。
@JimB 我确实在客户端方法上看到(opts ...grpc.CallOption)
,但在服务器方法上没有看到
哦,是的,对不起——我把它弄反了。
【参考方案1】:
见Sending and receiving metadata - server side
请求上下文具有将请求与连接匹配的信息。您使用grpc.SetHeader
或grpc.SendHeader
从服务器写入额外的元数据
func (s *server) SomeRPC(ctx context.Context, in *pb.someRequest) (*pb.someResponse, error)
// create and send header
header := metadata.Pairs("header-key", "val")
grpc.SendHeader(ctx, header)
// create and set trailer
trailer := metadata.Pairs("trailer-key", "val")
grpc.SetTrailer(ctx, trailer)
【讨论】:
谢谢!这很有意义。从grpc.SetHeader
的源代码我可以看到仍然有一个流连接,但它是“秘密”附加到上下文的以上是关于如何为一元 rpc 定义响应标头的主要内容,如果未能解决你的问题,请参考以下文章
如何为 AWS API Gateway 自定义授权方配置 CORS?