¿Puedo definir una llamada grpc con una solicitud o respuesta nula?

117

¿La sintaxis rpc en proto3 permite solicitudes o respuestas nulas?

por ejemplo, quiero el equivalente de lo siguiente:

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

¿O debería simplemente crear un tipo nulo?

message Null {};

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

Respuestas:

164

El comentario de Kenton a continuación es un buen consejo:

... nosotros, como desarrolladores, somos muy malos para adivinar lo que podríamos querer en el futuro. Por lo tanto, recomiendo estar seguro al definir siempre parámetros personalizados y tipos de resultados para cada método, incluso si están vacíos.


Respondiendo a mi propia pregunta:

Mirando a través de los archivos proto predeterminados, me encontré con Empty que es exactamente como el tipo Null que sugerí anteriormente :)

extracto de ese archivo:

// 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
fuente
33
Si. Vacía es la solicitud o respuesta canónica "No me importa". Notaré que, si cree que puede querer argumentos o valores de retorno en el futuro, cree un mensaje nuevo que simplemente no tenga campos. De esa manera, puede agregar nuevos campos cuando lo necesite y no romper ningún código de aplicación. Vacío es ideal para cuando nunca querrá argumentos o valores de retorno.
Eric Anderson
40
@EricAnderson tiene razón, pero yo diría que nosotros, como desarrolladores, somos muy malos para adivinar lo que podríamos querer en el futuro. Por lo tanto, recomiendo estar seguro al definir siempre parámetros personalizados y tipos de resultados para cada método, incluso si están vacíos.
Kenton Varda
1
"... nosotros, como desarrolladores, somos muy malos para adivinar lo que podríamos querer en el futuro". ¿Esto requeriría un Emptymensaje separado para cada llamada de función individual? Eso es todo un sacrificio.
Robert de W
29

También puede utilizar predefinidos:

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

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

también puede usar otra propiedad bool dentro de la estructura Responder. Me gusta esto

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

así que si no encuentra el resultado o si ocurrió algún error, puede regresar de la clase de servicio este

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