Posso definir uma chamada grpc com uma solicitação ou resposta nula?

117

A sintaxe rpc no proto3 permite solicitações ou respostas nulas?

por exemplo, quero o equivalente ao seguinte:

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

Ou devo apenas criar um tipo nulo?

message Null {};

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

Respostas:

165

O comentário de Kenton abaixo é um bom conselho:

... nós, como desenvolvedores, somos realmente ruins em adivinhar o que podemos desejar no futuro. Então, eu recomendo estar seguro sempre definindo parâmetros personalizados e tipos de resultados para cada método, mesmo se eles estiverem vazios.


Respondendo minha própria pergunta:

Olhando através dos arquivos proto padrão, encontrei Vazio que é exatamente como o tipo Nulo que sugeri acima :)

trecho desse arquivo:

// 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
fonte
33
Sim. Vazio é a solicitação ou resposta canônica "Não me importa". Vou observar, se você acha que pode querer argumentos ou valores de retorno no futuro, faça uma nova mensagem que simplesmente não tenha campos. Dessa forma, você pode adicionar novos campos quando precisar e não quebrar nenhum código do aplicativo. Vazio é ótimo para quando você nunca vai querer argumentos ou valores de retorno.
Eric Anderson
40
@EricAnderson está basicamente certo, mas eu diria que nós, como desenvolvedores, somos realmente ruins em adivinhar o que podemos querer no futuro. Então, eu recomendo estar seguro sempre definindo parâmetros personalizados e tipos de resultados para cada método, mesmo se eles estiverem vazios.
Kenton Varda
1
"... nós, como desenvolvedores, somos realmente ruins em adivinhar o que podemos querer no futuro." Isso exigiria uma Emptymensagem separada para cada chamada de função individual? É um grande sacrifício.
Robert de W
29

Você também pode usar predefinidos:

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

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

você também pode usar outra propriedade bool dentro da estrutura Reply. como isso

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

então se você não encontrar o resultado ou algum erro aconteceu, você pode retornar da classe de serviço este

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