How to define response headers for unary rpc

做~自己de王妃 提交于 2019-12-11 07:36:42

问题


In Go, I want to set some response headers from inside my rpc handler implementation. Specifically, I want to set some headers related to cache control.

However, when the rpc is defined as unary response, the method signature generated by protoc only includes the request context and request message. This is in contrast to the code generated from a streaming response, which includes the request message and a grpc.ServerStream.

Here's an example interface generated by protoc:

type CmsServer interface {
  GetPost(context.Context, *PostRequest) (*Post, error)
  GetPosts(*GetPostsOptions, Cms_GetPostsServer) error
}

In the example, GetPosts includes Cms_GetPostsServer parameter which is a grpc.ServerStream that appears to include methods to set custom response headers https://godoc.org/google.golang.org/grpc#ServerStream (i have not tried this yet so correct me if this is wrong).

Meanwhile, GetPost doesn't appear to have any way to set response headers just by looking at the method signature (context.Context is only the request context, not the response context). So how do i set custom response headers for a unary response?


回答1:


See Sending and receiving metadata - server side

The request Context has the information to match the request with the connection. You use the grpc.SetHeader or grpc.SendHeader to write extra metadata from the server

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)
}


来源:https://stackoverflow.com/questions/48631477/how-to-define-response-headers-for-unary-rpc

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!