【问题标题】:Can protobuf service method return primitive type?protobuf 服务方法可以返回原始类型吗?
【发布时间】:2015-05-06 18:08:25
【问题描述】:

我正在尝试使用 Google protobuf,我有以下描述:

message.proto 文件:

message Request {
   required int32 id = 1;
   optional string value = 2;
}

service.proto 文件:

import "message.proto";

service Service {
    rpc request (Request) returns (bool);
}

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

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

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

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

【问题讨论】:

  • message Bool { bool status = 1; }怎么样

标签: protocol-buffers rpc protobuf-c


【解决方案1】:

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

这很重要,因为可以稍后扩展消息类型,以防您决定要添加新参数或返回一些额外数据。

【讨论】:

  • 与其他用于定义服务的架构相比,恕我直言,这是一个缺点。例如,WCF 支持原始返回类型。消息对可扩展性开放的论点似乎掩盖了 Protobuf 的缺点。
  • @ToreAurstad 修改 protobuf 使其在此处允许原始类型非常容易。不这样做是有意的设计决定。
【解决方案2】:

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

message Name {
  string name = 1;
}

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

message Void {} 

message Name {
  string name = 1;
}

..
service MyService{
  rpc MyFunc(Name) returns (Void);
}

【讨论】:

  • Void 已经可用:import "google/protobuf/empty.proto";
【解决方案3】:

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

service.proto 文件:

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

service Service {
    rpc request (Request) returns (.google.protobuf.BoolValue); 
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多