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

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

报告相同问题?

悬赏问题

  • ¥100 求购一套带接口实现实习自动签到打卡
  • ¥50 MacOS 使用虚拟机安装k8s
  • ¥500 亚马逊 COOKIE我如何才能实现 登录一个亚马逊账户 下发新 COOKIE ..我使用下发新COOKIE 导入ADS 指纹浏览器登录,我把账户密码 修改过后,原来下发新COOKIE 不会失效的方式
  • ¥20 玩游戏gpu和cpu利用率特别低,玩游戏卡顿
  • ¥25 oracle中的正则匹配
  • ¥15 关于#vscode#的问题:把软件卸载不会再出现蓝屏
  • ¥15 vimplus出现的错误
  • ¥15 usb无线网卡转typec口
  • ¥30 怎么使用AVL fire ESE软件自带的优化模式来优化设计Soot和NOx?
  • ¥15 Ubuntu20.04.4.LTS系统如何下载安装VirtualBox虚拟机?