不带参数的Protobuf RPC Service方法

Mic*_*son 35 protocol-buffers protorpc

我正在尝试使用Google的Protocol Buffers来描述RPC服务

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

message Whoami {
  optional bytes request_id = 1;
  optional string hostname = 2;
  optional string message = 3;
}
Run Code Online (Sandbox Code Playgroud)

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

它工作正常,如果我取代WhoAreYou()WhoAreYou(Whoami),但在这种情况下,该方法不需要任何参数.是有办法做到这一点还是根本不支持?

Ken*_*rda 57

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

message WhoAreYouParams {}
Run Code Online (Sandbox Code Playgroud)

这是必需的原因,如果您以后需要添加可选参数,则可以在不破坏现有代码的情况下执行此操作.


Ale*_*lex 24

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

rpc WhoAreYou(google.protobuf.Empty) returns (Whoami) {
}
Run Code Online (Sandbox Code Playgroud)

不要忘记导入适当的proto文件:

import "google/protobuf/empty.proto";
Run Code Online (Sandbox Code Playgroud)

  • 这是更准确的答案。 (3认同)
  • 不建议这样做,因为以后无法通过向后兼容对其进行更改。 (2认同)
  • “不建议这样做,因为以后无法通过向后兼容性来更改它。” –– 我假设将请求或响应消息从空更改为非空不会破坏此服务的现有用户。因此,我们只讨论源代码级别的中断,突然您需要修改使用该服务的客户端的源代码。是对的吗?(我找不到任何关于不断发展的 gRPC 服务的文档) (2认同)