Kann ich einen grpc-Aufruf mit einer Null-Anfrage oder -Antwort definieren?

113

Erlaubt die RPC-Syntax in Proto3 Null-Anfragen oder -Antworten?

zB möchte ich das Äquivalent von Folgendem:

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

Oder sollte ich einfach einen Nulltyp erstellen?

message Null {};

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

Antworten:

160

Kentons Kommentar unten ist ein guter Rat:

... wir als Entwickler sind wirklich schlecht darin zu erraten, was wir in Zukunft wollen könnten. Ich empfehle daher, sicher zu sein, indem immer benutzerdefinierte Parameter und Ergebnistypen für jede Methode definiert werden, auch wenn diese leer sind.


Beantwortung meiner eigenen Frage:

Beim Durchsuchen der Standard-Proto-Dateien bin ich auf Empty gestoßen , das genau dem oben vorgeschlagenen Null-Typ entspricht :)

Auszug aus dieser Datei:

// 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
quelle
32
Ja. Leer ist die kanonische Anfrage oder Antwort "Es ist mir egal". Ich werde beachten Sie , wenn Sie denken , Sie können Argumente oder Rückgabewerte in der Zukunft wollen, stellen Sie eine neue Nachricht , dass einfach keine Felder hat. Auf diese Weise können Sie bei Bedarf neue Felder hinzufügen und keinen Anwendungscode beschädigen. Leer ist ideal, wenn Sie niemals Argumente oder Rückgabewerte wünschen.
Eric Anderson
39
@EricAnderson hat größtenteils recht, aber ich würde argumentieren, dass wir als Entwickler wirklich schlecht darin sind, zu erraten, was wir in Zukunft wollen könnten. Ich empfehle daher, sicher zu sein, indem immer benutzerdefinierte Parameter und Ergebnistypen für jede Methode definiert werden, auch wenn diese leer sind.
Kenton Varda
"... wir als Entwickler können wirklich schlecht erraten, was wir in Zukunft wollen könnten.", Dies würde eine separate EmptyNachricht für jeden einzelnen Funktionsaufruf erfordern ? Das ist ein ziemliches Opfer.
Robert de W
28

Sie können auch vordefinierte verwenden:

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

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

Sie können auch eine andere bool-Eigenschaft innerhalb der Antwortstruktur verwenden. so was

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

Wenn Sie das Ergebnis nicht finden oder ein Fehler aufgetreten ist, können Sie dies von der Serviceklasse zurückgeben

return new Reply()
{
   Found = false
};
dkokkinos
quelle