179

proto3 中的 rpc 语法是否允许空请求或响应?

例如,我想要以下等价物:

rpc Logout;
rpc Status returns (Status);
rpc Log (LogData);

或者我应该只创建一个空类型?

message Null {};

rpc Logout (Null) returns (Null);
rpc Status (Null) returns (Status);
rpc Log (LogData) returns (Null);
4

3 回答 3

244

Kenton 在下面的评论是合理的建议:

...作为开发人员,我们真的不擅长猜测我们未来可能想要什么。所以我建议通过始终为每个方法定义自定义参数和结果类型来确保安全,即使它们是空的。


回答我自己的问题:

查看默认的 proto 文件,我发现Empty与我上面建议的 Null 类型完全一样 :)

该文件的摘录:

// A generic empty message that you can re-use to avoid defining duplicated
// empty messages in your APIs. A typical example is to use it as the request
// or the response type of an API method. For instance:
//
//     service Foo {
//       rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);
//     }
//

message Empty {

}
于 2015-08-02T14:39:12.417 回答
90

您还可以使用预定义的:

import "google/protobuf/empty.proto";
package MyPackage;

service MyService {
  rpc Check(google.protobuf.Empty) returns (google.protobuf.Empty) {}
}
于 2019-10-22T12:45:35.307 回答
-1

您还可以在回复结构中使用另一个布尔属性。像这样

message Reply {
  string result = 1;
  bool found = 2;
}

所以如果你没有找到结果或者发生了一些错误,你可以从服务类返回这个

return new Reply()
{
   Found = false
};
于 2019-10-08T07:36:10.890 回答