2015-08-02 14 views
38

Czy składnia rpc w protokole proto3 zezwala na puste żądania lub odpowiedzi?Czy mogę zdefiniować wywołanie grpc z pustym żądaniem lub odpowiedzią?

np. Chcę mieć odpowiednik następującego:

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

Czy powinienem po prostu utworzyć typ zerowy? poniżej

message Null {}; 

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

Odpowiedz

54

komentarz Kenton jest dobra rada:

... my jako programiści są bardzo złe w zgadywanie, co może chcemy w przyszłości. Dlatego zalecam bycie bezpiecznym poprzez zawsze 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:

pominie pliki domyślne proto, natknąłem Empty że jest dokładnie tak jak Null typu zasugerowałem wyżej :)

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

} 
+12

Tak. Pusty jest kanoniczna prośba lub odpowiedź "Nie obchodzi mnie". Będę pamiętać, jeśli myślisz, że możesz "chcieć" argumentów lub zwrócić wartości w przyszłości, zrób nową wiadomość, która po prostu nie ma pól. W ten sposób możesz dodawać nowe pola, gdy potrzebujesz, a nie łamać żadnego kodu aplikacji. Pusta jest świetna, gdy nigdy nie będziesz chciał używać argumentów ani zwracać wartości. –

+18

@EricAnderson ma w zasadzie rację, ale twierdzę, że my jako programiści jesteśmy naprawdę źli, jeśli chodzi o odgadnięcie, czego możemy chcieć w przyszłości. Dlatego zalecam bycie bezpiecznym poprzez zawsze definiowanie niestandardowych parametrów i typów wyników dla każdej metody, nawet jeśli są one puste. –