如何为一元 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.SetHeadergrpc.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?

如何覆盖 Laminas XML-RPC 服务器响应的标头?

如何为Web请求指定标头

Erlang Cowboy如何为静态文件添加响应头

如何为 C++ 智能感知引擎定义宏?

如何为 404 Not Found 创建自定义响应消息?