Подтвердить что ты не робот

Могу ли я определить вызов grpc с нулевым запросом или ответом?

Является ли синтаксис rpc в proto3 допустимыми нулевыми запросами или ответами?

например. Я хочу эквивалент следующего:

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

Или я должен просто создать нулевой тип?

message Null {};

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

Ответ 1

Комментарий Kenton ниже звучит советом:

... мы, как разработчики, действительно плохо угадываем, чего мы хотим в будущем. Поэтому я рекомендую быть безопасным, всегда определяя настраиваемые параметры и типы результатов для каждого метода, даже если они пусты.


Отвечая на мой собственный вопрос:

Просматривая протонные файлы по умолчанию, я натолкнулся на 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 {

}

Ответ 2

Вот полный пример с использованием google.protobuf.Empty как описано в @mark-kahn и предложено @attila123. Вам необходимо импортировать его из google/protobuf/empty.proto. В большинстве случаев это должно быть в вашем пути к компилятору.

syntax = "proto3";
import "google/protobuf/empty.proto";

rpc Logout (google.protobuf.Empty) returns (google.protobuf.Empty);
rpc Status (google.protobuf.Empty) returns (Status);
rpc Log (LogData) returns (google.protobuf.Empty);

Ответ 3

Вы также можете использовать другое свойство bool внутри структуры Reply. как это

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

поэтому, если вы не нашли результат или произошла какая-то ошибка, вы можете вернуть из класса обслуживания этот

return new Reply()
{
   Found = false
};