web-dev-qa-db-ja.com

protobufサービスメソッドはプリミティブ型を返すことができますか?

私はGoogleprotobufを使おうとしていますが、次の説明があります。

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の代わりに)プリミティブ型をサービスメソッドの引数として使用できますか?

19
4ntoine

いいえ、プリミティブ型を要求または応答として使用することはできません。メッセージタイプを使用する必要があります。

新しいパラメータを追加したり、追加のデータを返したりする場合に備えて、メッセージタイプは後で拡張できるため、これは重要です。

24
Kenton Varda

プリミティブ型を返したい場合は、それをmessageでラップして、次のように返します。

message Name {
  string name = 1;
}

何も返したくない場合は、voidつまり、空のメッセージを作成するだけです。

message Void {} 

message Name {
  string name = 1;
}

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