我可以使用空请求或响应定义grpc调用吗?


116

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);

Answers:


163

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

...作为开发人员,我们真的很难猜测未来的需求。因此,我建议始终为每种方法定义自定义参数和结果类型,即使它们为空也是安全的。


回答我自己的问题:

浏览默认的原始文件时,我遇到了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 {

}

33
是。空是标准的“我不在乎”请求或响应。我会指出,如果您认为将来可能需要参数或返回值,请发送一条新的消息,该消息根本没有任何字段。这样,您可以在需要时添加新字段,而不会破坏任何应用程序代码。当您永远不需要参数或返回值时,Empty非常有用。
埃里克·安德森

40
@EricAnderson基本上是正确的,但我会认为,作为开发人员,我们真的很bad测未来的需求。因此,我建议始终为每种方法定义自定义参数和结果类型,即使它们为空也是安全的。
肯顿·瓦尔达

1
“ ...作为开发人员,我们真的很难猜测我们将来会想要什么。”,这将需要Empty为每个单独的函数调用单独发送一条消息吗?那是一个很大的牺牲。
罗伯特·德W

29

您还可以使用预定义的:

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

service MyService {
  rpc Check(google.protobuf.Empty) returns (google.protobuf.Empty) {}
}

0

您还可以在Reply结构内使用另一个bool属性。像这样

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

因此,如果找不到结果或发生了某些错误,则可以从服务类返回

return new Reply()
{
   Found = false
};
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.