dongmeng2687 2017-12-01 18:34 采纳率: 0%
浏览 668
已采纳

客户端上的gRPC上下文

I am building a client/server system in go, using gRPC and protobuf (and with a gRPC gateway to REST).

I use metadata in the context on the server side to carry authentication data from the client, and that works perfectly well.

Now, I'd like the server to set some metadata keys/values so that the client can get them, alongside with the response. How can I do that? Using 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, but on the response rather than the request?)

Here is the code for the server and for the client.

  • 写回答

1条回答 默认 最新

  • dongluanban3536 2017-12-04 18:14
    关注

    I finally found my way: https://github.com/grpc/grpc-go/blob/master/Documentation/grpc-metadata.md

    So basically, grpc.SetHeader() + grpc.SendHeader() and grpc.SetTrailer() are totally what I was looking for. On the client side, grpc.Header() and grpc.Trailer() functions need to be passed to the RPC call, and their argument is a metadata.MD object to be filled.

    On the client side, define your receiving metadata:

    var header, trailer metadata.MD
    

    Then, pass it to the SomeRPCCall() unary RPC:

    response, err := client.SomeRPCCall(
        context.Background(),
        proto.MyMessage{},
        grpc.Header(&header),
        grpc.Trailer(&trailer),
    )
    

    And now, you can check what's in your metadata:

    for key, value := range header {
        fmt.Printf("%s => %s", key, value)
    }
    
    for key, value := range trailer {
        fmt.Printf("%s => %s", key, value)
    }
    

    On the server side, you can:

    • force the data to be sent right after the RPC is received (but before it's processed):

      grpc.SendHeader(ctx, metadata.New(map[string]string{"my-key": "my-value"}))

    • or set & send the metadata at the end of the RPC process (along with the Status):

      grpc.SetTrailer(ctx, metadata.New(map[string]string{"my-key": "my-value"}))

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮