リクエストまたはレスポンスがnullのgrpc呼び出しを定義できますか?


117

proto3のrpc構文はnullリクエストまたはレスポンスを許可しますか?

例えば、私は次のものと同等のものを望みます:

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

回答:


164

以下のケントンのコメントは健全なアドバイスです:

...開発者としての私たちは、私たちが将来何を望んでいるかを推測するのが本当に苦手です。そのため、空の場合でも、すべてのメソッドのカスタムパラメータと結果タイプを常に定義することにより、安全であることをお勧めします。


私自身の質問に答える:

デフォルトのprotoファイルを見ると、上記で提案したNull型とまったく同じであるEmptyが見つかりました。

そのファイルからの抜粋:

// 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
はい。空は、正規の "I do n't care"リクエストまたはレスポンスです。将来的に引数や戻り値必要になると思われる場合は、フィールドのない新しいメッセージを作成してください。そうすることで、必要なときに新しいフィールドを追加でき、アプリケーションコードを壊すことがありません。空は、引数や戻り値が不要な場合に最適です。
エリックアンダーソン

40
@EricAndersonはほぼ正しいですが、私たち開発者は、将来何が欲しいかを推測するのが本当に苦手だと私は主張します。そのため、空の場合でも、すべてのメソッドのカスタムパラメータと結果タイプを常に定義することにより、安全であることをお勧めします。
ケントンバルダ2015

1
「...私たち開発者は、私たちが将来何を望んでいるかを推測するのが本当に苦手です。」これには、Empty個々の関数呼び出しごとに個別のメッセージが必要になるでしょうか?それはかなりの犠牲です。
Robert de 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
};
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.