Как отправить конечные метаданные из службы Python gRPC в веб-клиент grpc? - PullRequest
0 голосов
/ 19 июня 2019

Я пытаюсь отправить конечные метаданные из службы Python gRPC в веб-клиент grpc.Но на стороне клиента я не могу его получить.

Я использую прокси-сервер 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 голосов
/ 19 июня 2019

Перед вызовом метода set_trailing_metadata необходимо вызвать send_initial_metadata с теми же ключами medatdata, но с любыми значениями.

В моем случае это будет выглядеть такthis:

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.

...