Puis-je définir un appel grpc avec une requête ou une réponse nulle?

117

La syntaxe rpc de proto3 autorise-t-elle les requêtes ou réponses nulles?

par exemple, je veux l'équivalent de ce qui suit:

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

Ou devrais-je simplement créer un type nul?

message Null {};

rpc Logout (Null) returns (Null);
rpc Status (Null) returns (Status);
rpc Log (LogData) returns (Null);
Mark Kahn
la source

Réponses:

165

Le commentaire de Kenton ci-dessous est un bon conseil:

... en tant que développeurs, nous ne savons vraiment pas ce que nous pourrions souhaiter à l'avenir. Je recommande donc d'être prudent en définissant toujours des paramètres personnalisés et des types de résultats pour chaque méthode, même s'ils sont vides.


Répondre à ma propre question:

En parcourant les fichiers proto par défaut, je suis tombé sur Empty qui est exactement comme le type Null que j'ai suggéré ci-dessus :)

extrait de ce fichier:

// 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
la source
33
Oui. Vide est la demande ou la réponse canonique «Je m'en fiche». Je noterai que si vous pensez que vous voudrez peut -être des arguments ou des valeurs de retour à l'avenir, créez un nouveau message qui n'a tout simplement pas de champs. De cette façon, vous pouvez ajouter de nouveaux champs lorsque vous en avez besoin et ne pas casser le code d'application. Empty est idéal lorsque vous ne voudrez jamais d'arguments ou de valeurs de retour.
Eric Anderson
40
@EricAnderson a généralement raison, mais je dirais qu'en tant que développeurs, nous sommes vraiment mal à deviner ce que nous pourrions vouloir à l'avenir. Je recommande donc d'être prudent en définissant toujours des paramètres personnalisés et des types de résultats pour chaque méthode, même s'ils sont vides.
Kenton Varda
1
"... en tant que développeurs, nous sommes vraiment mauvais pour deviner ce que nous pourrions vouloir à l'avenir.", Cela nécessiterait un Emptymessage séparé pour chaque appel de fonction individuel? C'est tout un sacrifice.
Robert de W le
29

Vous pouvez également utiliser des éléments prédéfinis:

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

service MyService {
  rpc Check(google.protobuf.Empty) returns (google.protobuf.Empty) {}
}
hdnn
la source
0

vous pouvez également utiliser une autre propriété booléenne dans la structure Reply. comme ça

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

donc si vous ne trouvez pas le résultat ou qu'une erreur s'est produite, vous pouvez renvoyer de la classe de service ceci

return new Reply()
{
   Found = false
};
Dkokkinos
la source