1

Python gRPC サービスから grpc-web クライアントに末尾のメタデータを送信しようとしています。しかし、クライアント側ではそれを受け取ることができません。

envoy プロキシ サーバーを使用して、grpc-web を python gRPC サービスに接続しています。

メタデータを送信するために、私はこの方法を使用しています:

class Greeter(helloworld_pb2_grpc.GreeterServicer):
    def SayHello(self, request, context):
        context.set_trailing_metadata((
            ('checksum', 'I agree'),
            ('retry', 'false'),
        ))
        return helloworld_pb2.HelloReply(message='Hello, %s!' % request.name)

クライアントでは、次の方法でメタデータにアクセスしようとしています:

var call = greeterService.sayHello(request, {}, function(err, response) {
  if (err) {
    console.log(err.code);
    console.log(err.message);
  } else {
    console.log(response.getMessage());
  }
});
call.on('status', function(status) {
  console.log(status.code);
  console.log(status.details);
  console.log(status.metadata); // here should arrive metadata
});

ドキュメントに記載されている方法で送信しています。しかし、メタデータが届きません。

誰もそのような問題を抱えていましたか?

4

1 に答える 1

1

method を呼び出す前に、同じ medatdata キーで任意の値を指定set_trailing_metadataして呼び出す必要があります。send_initial_metadata

私の場合、次のようになります。

class Greeter(helloworld_pb2_grpc.GreeterServicer):
    def SayHello(self, request, context):
        context.send_initial_metadata((
            ('checksum', ''),
            ('retry', ''),
        ))
        context.set_trailing_metadata((
            ('checksum', 'I agree'),
            ('retry', 'false'),
        ))
        return helloworld_pb2.HelloReply(message='Hello, %s!' % request.name)

実際、私はこの解決策を偶然見つけました。

最初のメタデータでヘッダー名を指定する必要があり、その場合にのみ、末尾のメタデータでヘッダー値を設定する必要があると想定しています。そうすれば、envoy はそれを適切にパックして、HTTP 1.1 経由で配信できます。

于 2019-06-19T12:50:22.110 に答える