【问题标题】:How to send trailing metadata from python gRPC service to grpc-web client?如何将尾随元数据从 python gRPC 服务发送到 grpc-web 客户端?
【发布时间】:2019-06-19 12:50:22
【问题描述】:

我正在尝试将尾随元数据从 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
});

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

有人遇到过这样的问题吗?

【问题讨论】:

    标签: javascript python envoyproxy grpc-web


    【解决方案1】:

    在调用方法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)
    

    其实我偶然发现了这个解决方案。

    我假设您需要在初始元数据中指定 headers names,然后才应该在尾随元数据中设置 headers values,然后 envoy 可以正确打包并通过HTTP 1.1。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-09
      • 2020-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多