protobuf服务方法可以返回原始类型吗?

4nt*_*ine 15 rpc protocol-buffers protobuf-c

我正在尝试使用Google protobuf,我正在进行下一个描述:

message.proto文件:

message Request {
   required int32 id = 1;
   optional string value = 2;
}
Run Code Online (Sandbox Code Playgroud)

service.proto文件:

import "message.proto";

service Service {
    rpc request (Request) returns (bool);
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试生成c ++源代码并收到错误:

$ protoc service.proto --cpp_out =/tmp/proto/build

service.proto:4:40:预期的消息类型.

我是否必须仅返回用户定义的类型?是原始的(像boolstring)支持?我可以使用原始类型作为服务方法参数(而不是Request在我的示例中)吗?

Ken*_*rda 22

不,您不能将原始类型用作请求或响应.您必须使用消息类型.

这很重要,因为如果您决定要添加新参数或返回一些其他数据,可以稍后扩展消息类型.

  • @ToreAurstad 修改 protobuf 以便它允许此处的原始类型非常容易。不这样做是有意的设计决定。 (3认同)

小智 10

您可以通过使用wrappers.proto返回标量数据类型,如bool、int等

service.proto文件:

import "message.proto";
import "google/protobuf/wrappers.proto";

service Service {
    rpc request (Request) returns (.google.protobuf.BoolValue); 
}
Run Code Online (Sandbox Code Playgroud)


Muh*_*man 7

如果要返回原始类型,请将其包装在 a 中message并返回:

message Name {
  string name = 1;
}
Run Code Online (Sandbox Code Playgroud)

如果您不想返回任何内容,void我的意思是,您可以创建一个空消息:

message Void {} 

message Name {
  string name = 1;
}

..
service MyService{
  rpc MyFunc(Name) returns (Void);
}
Run Code Online (Sandbox Code Playgroud)

  • Void 已经可用: import "google/protobuf/empty.proto"; (6认同)