Czy mogę zdefiniować wywołanie grpc z zerowym żądaniem lub odpowiedzią?

117

Czy składnia RPC w protokole proto3 zezwala na zerowe żądania lub odpowiedzi?

np. chcę odpowiednika następujących rzeczy:

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

Czy powinienem po prostu utworzyć typ zerowy?

message Null {};

rpc Logout (Null) returns (Null);
rpc Status (Null) returns (Status);
rpc Log (LogData) returns (Null);
Mark Kahn
źródło

Odpowiedzi:

165

Komentarz Kentona poniżej jest rozsądną radą:

... my, jako programiści, bardzo słabo zgadujemy, czego możemy chcieć w przyszłości. Dlatego zalecam bezpieczne definiowanie niestandardowych parametrów i typów wyników dla każdej metody, nawet jeśli są one puste.


Odpowiadając na moje własne pytanie:

Przeglądając domyślne pliki Proto, natknąłem się na Empty , dokładnie taki sam, jak zasugerowany powyżej typ Null :)

wyciąg z tego pliku:

// 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 {

}
Mark Kahn
źródło
33
Tak. Puste jest kanoniczne żądanie lub odpowiedź „Nie obchodzi mnie to”. Będę pamiętać, jeśli uważasz, że może chcieć argumentów i wartości zwracanych w przyszłości utworzyć nową wiadomość, że po prostu nie ma żadnego pola. W ten sposób możesz dodawać nowe pola, gdy zajdzie taka potrzeba, i nie łamać żadnego kodu aplikacji. Puste jest świetne, gdy nigdy nie będziesz chciał argumentów ani zwracać wartości.
Eric Anderson
40
@EricAnderson jest głównie w porządku, ale chciałbym twierdzić, że my jako programiści są bardzo złe w zgadywanie, co może chcemy w przyszłości. Dlatego zalecam bezpieczne definiowanie niestandardowych parametrów i typów wyników dla każdej metody, nawet jeśli są one puste.
Kenton Varda
1
„… my, jako programiści, naprawdę źle znamy się na odgadywaniu, czego możemy chcieć w przyszłości.”, wymagałoby to oddzielnego Emptykomunikatu dla każdego wywołania funkcji? To spora ofiara.
Robert de W
29

Możesz także użyć predefiniowanych:

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

service MyService {
  rpc Check(google.protobuf.Empty) returns (google.protobuf.Empty) {}
}
hdnn
źródło
0

możesz również użyć innej właściwości bool w strukturze odpowiedzi. lubię to

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

więc jeśli nie znajdziesz wyniku lub wystąpił jakiś błąd, możesz zwrócić to z klasy usług

return new Reply()
{
   Found = false
};
dkokkinos
źródło