Protocol buffers 不带参数的Protobuf RPC服务方法

Protocol buffers 不带参数的Protobuf RPC服务方法,protocol-buffers,protorpc,Protocol Buffers,Protorpc,我试图描述一个使用Google的协议缓冲区的RPC服务 service WhoamiService { rpc WhoAreYou() returns (Whoami) {} } message Whoami { optional bytes request_id = 1; optional string hostname = 2; optional string message = 3; } 当我试图编译这个定义时,我得到一个错误预期的类型名,指向WhoAreYou()片段

我试图描述一个使用Google的协议缓冲区的RPC服务

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

message Whoami {
  optional bytes request_id = 1;
  optional string hostname = 2;
  optional string message = 3;
}
当我试图编译这个定义时,我得到一个错误
预期的类型名
,指向
WhoAreYou()
片段


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

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

message WhoAreYouParams {}

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

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

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

import "google/protobuf/empty.proto";

此页面的访问者可能还对和google.protobuf.Emptyth感兴趣。这是更准确的答案。不建议这样做,因为以后无法使用向后兼容性对其进行更改。“不建议这样做,因为以后无法使用向后兼容性对其进行更改。”–我认为将请求或响应消息从空更改为非空不会中断此服务的现有用户。所以我们只讨论在源代码级别中断,突然需要修改使用该服务的客户端的源代码。是这样吗?(我找不到任何关于不断发展的gRPC服务的文档)**2.6版本中也不支持我想知道,“破坏现有代码”是指在源代码级别上破坏,对吗?编译后的客户端只会忽略突然出现新字段的消息。
import "google/protobuf/empty.proto";