Чи можна визначити виклик 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);

Відповіді:


164

Коментар Кентона нижче - слушна порада:

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


Відповідаючи на власне запитання:

Переглядаючи протокольні файли за замовчуванням, я натрапив на 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
Так. Порожній - це канонічний запит чи відповідь "Мені все одно". Зауважу, якщо ви думаєте, що, можливо, у майбутньому ви хочете аргументів або повертати значення, складіть нове повідомлення, у якого просто немає полів. Таким чином ви можете додавати нові поля, коли вам потрібно, а не порушувати жоден код програми. Порожня чудово підходить для тих випадків, коли ви ніколи не захочете аргументів чи повернення значень.
Ерік Андерсон

40
@EricAnderson здебільшого має рацію, але я б заперечував, що ми, як розробники, дуже погано здогадуємось, що ми можемо захотіти в майбутньому. Тому я рекомендую бути безпечним, завжди визначаючи спеціальні параметри та типи результатів для кожного методу, навіть якщо вони порожні.
Кентон Варда

1
"... ми, як розробники, насправді погано відгадуємо, що ми можемо захотіти в майбутньому". Це вимагатиме окремого Emptyповідомлення для кожного виклику функції? Це досить жертва.
Роберт де W

29

Ви також можете використовувати попередньо визначені:

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

service MyService {
  rpc Check(google.protobuf.Empty) returns (google.protobuf.Empty) {}
}

0

ви також можете використовувати інше властивість bool всередині структури відповідей. подобається це

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

тому якщо ви не знайдете результат або сталася якась помилка, ви можете повернутися з класу обслуговування

return new Reply()
{
   Found = false
};
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.