【问题标题】:Protobuf RPC Service method without parameters没有参数的 Protobuf RPC 服务方法
【发布时间】:2015-06-23 14:22:27
【问题描述】:

我正在尝试使用 Google 的协议缓冲区来描述 RPC 服务

service WhoamiService {
  rpc WhoAreYou() returns (Whoami) {}
}

message Whoami {
  optional bytes request_id = 1;
  optional string hostname = 2;
  optional string message = 3;
}

当我尝试编译这个定义时,我收到一个错误 Expected type name 指向 WhoAreYou() 片段。

如果我用WhoAreYou(Whoami) 替换WhoAreYou() 效果很好,但在这种情况下,该方法不需要任何参数。有没有办法做到这一点,还是根本不支持?

【问题讨论】:

标签: protocol-buffers protorpc


【解决方案1】:

您可以指定google.protobuf.Empty 而不是您自己的空消息。 示例:

rpc WhoAreYou(google.protobuf.Empty) returns (Whoami) {
}

别忘了导入合适的 proto 文件:

import "google/protobuf/empty.proto";

【讨论】:

  • 这是更准确的答案。
  • 不建议这样做,因为向后兼容无法更改。
  • "不建议这样做,因为向后兼容无法更改。" –– 我认为将请求或响应消息从 Empty 更改为非空内容不会破坏该服务的现有用户。所以我们只讨论源代码级别的中断,突然您需要修改使用该服务的客户端的源代码。那正确吗? (我找不到任何关于发展 gRPC 服务的文档)
  • ** 2.6 版也不支持
【解决方案2】:

您必须指定输入类型。如果您不希望该方法接受任何参数,请定义一个空消息类型,例如:

message WhoAreYouParams {}

需要这样做的原因是,如果您以后需要添加可选参数,您可以在不破坏现有代码的情况下这样做。

【讨论】:

  • 我想知道,“破坏现有代码”是指在源代码级别上破坏,对吗?已编译的客户端将简单地忽略其中突然包含新字段的消息。
猜你喜欢
  • 1970-01-01
  • 2013-07-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-18
相关资源
最近更新 更多