Могу ли я определить вызов 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);
Ответы
Ответ 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
};