2017-12-01 32 views
3

私は、gRPCとprotobuf(およびgRPCゲートウェイとREST)を使用して、クライアント/サーバシステムを構築しています。クライアント側のgRPCコンテキスト

私はmetadataをサーバー側のコンテキストで使用して、クライアントから認証データを受け取ります。これは完全にうまく動作します。

ここでは、クライアントがレスポンスとともにメタデータのキー/値を取得できるように、サーバーにメタデータのキー/値を設定します。どうやってやるの? SetHeaderSendHeaderを使用していますか?理想的には、私はそのメタデータを統合するために、サーバからのすべての単一の応答を希望(UnaryInterceptorのいくつかの種類として見ることができますが、応答はなく、要望に応じて?)

をここでserverためとのコードがありますclient

答えて

3

私は最終的に自分の道を見つけた:https://github.com/grpc/grpc-go/blob/master/Documentation/grpc-metadata.md

だから基本的には、grpc.SetHeader() + grpc.SendHeader()grpc.SetTrailer()は私が探していた全くものです。クライアント側では、grpc.Header()grpc.Trailer()関数をRPC呼び出しに渡す必要があり、その引数は埋められるオブジェクトmetadata.MDです。クライアント側では

、あなたの受信メタデータを定義します。

var header, trailer metadata.MD 

その後、SomeRPCCall()単項RPCに渡し:

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

そして今、あなたはあなたのメタデータに何があるか確認できます。

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

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

サーバー側では、次の操作を実行できます。

  • 右RPC後に送信すべきデータが受信された(しかし、それが処理される前)力は:

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

  • または&に沿って(RPCプロセスの最後にメタデータを送信する設定)Statusで:

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

関連する問題