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

时间:2015-08-02 04:49:01

标签: protocol-buffers grpc

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

e.g。我想要相当于以下内容:

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

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

message Null {};

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

3 个答案:

答案 0 :(得分:109)

以下肯顿的评论是合理的建议:

  

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

回答我自己的问题:

查看默认的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 {

}

答案 1 :(得分:4)

您还可以使用预定义:

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

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

答案 2 :(得分:0)

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

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

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

return new Reply()
{
   Found = false
};