如何将尾随元数据从python gRPC服务发送到grpc-web客户端?

时间:2019-06-19 12:50:22

标签: javascript python envoyproxy grpc-web

我正在尝试将python gRPC服务的尾随元数据发送到grpc-web客户端。但是在客户端,我无法收到它。

我正在使用Envoy代理服务器将grpc-web与pyhton 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
});

我将按照文档中的描述发送给它。但是元数据尚未到达。

有人有这样的问题吗?

1 个答案:

答案 0 :(得分:0)

在调用方法set_trailing_metadata之前,您需要使用相同的medatdata键但任何值调用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)

实际上我偶然发现了该解决方案。

我假设您需要在初始元数据中指定标头名称,然后才应在尾随元数据中设置标头值,然后使节可以正确打包并通过HTTP 1.1。