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

117

Допускает ли синтаксис 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);
Марк Кан
источник

Ответы:

165

Комментарий Кентона ниже - хороший совет:

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


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

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

}
Марк Кан
источник
33
Да. Пусто - это канонический запрос или ответ типа «Мне все равно». Замечу: если вы думаете, что в будущем вам могут понадобиться аргументы или возвращаемые значения, создайте новое сообщение, в котором просто нет полей. Таким образом, вы можете добавлять новые поля, когда вам нужно, и не нарушать код приложения. Empty отлично подходит, когда вам никогда не нужны аргументы или возвращаемые значения.
Эрик Андерсон,
40
@EricAnderson в основном прав, но я бы сказал, что мы, разработчики, действительно плохо догадываемся, чего мы можем захотеть в будущем. Поэтому я рекомендую быть в безопасности, всегда определяя настраиваемые параметры и типы результатов для каждого метода, даже если они пусты.
Кентон Варда
1
«... мы, как разработчики, действительно плохо понимаем, что мы можем захотеть в будущем.», Это потребует отдельного Emptyсообщения для каждого отдельного вызова функции? Это настоящая жертва.
Роберт де В,
29

Вы также можете использовать предопределенные:

import "google/protobuf/empty.proto";
package MyPackage;

service MyService {
  rpc Check(google.protobuf.Empty) returns (google.protobuf.Empty) {}
}
hdnn
источник
0

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

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

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

return new Reply()
{
   Found = false
};
Dkokkinos
источник