Posso definire una chiamata grpc con una richiesta o risposta nulla?


117

La sintassi rpc in proto3 consente richieste o risposte nulle?

ad esempio, voglio l'equivalente di quanto segue:

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

O dovrei semplicemente creare un tipo nullo?

message Null {};

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

Risposte:


165

Il commento di Kenton di seguito è un buon consiglio:

... noi sviluppatori non siamo davvero bravi a indovinare cosa potremmo desiderare in futuro. Quindi consiglio di essere al sicuro definendo sempre parametri personalizzati e tipi di risultati per ogni metodo, anche se sono vuoti.


Rispondendo alla mia domanda:

Esaminando i file proto predefiniti, mi sono imbattuto in Empty che è esattamente come il tipo Null che ho suggerito sopra :)

estratto da quel file:

// 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
Sì. Vuota è la canonica richiesta o risposta "Non mi interessa". Prendo atto, se si pensa che si potrebbe desiderare argomenti o valori di ritorno, in futuro, di effettuare un nuovo messaggio che semplicemente non ha campi. In questo modo puoi aggiungere nuovi campi quando necessario e non interrompere alcun codice dell'applicazione. Empty è ottimo per quando non vorrai mai argomenti o restituire valori.
Eric Anderson

40
@EricAnderson ha per lo più ragione, ma direi che noi sviluppatori non siamo davvero bravi a indovinare cosa potremmo desiderare in futuro. Quindi consiglio di essere al sicuro definendo sempre parametri personalizzati e tipi di risultati per ogni metodo, anche se sono vuoti.
Kenton Varda

1
"... noi sviluppatori non siamo davvero bravi a indovinare cosa potremmo desiderare in futuro.", Ciò richiederebbe un Emptymessaggio separato per ogni singola chiamata di funzione? È un bel sacrificio.
Robert de W

29

Puoi anche usare predefiniti:

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

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

0

puoi anche usare un'altra proprietà bool all'interno della struttura Reply. come questo

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

quindi se non trovi il risultato o si è verificato un errore puoi tornare dalla classe di servizio this

return new Reply()
{
   Found = false
};
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.