Hello,

Two of our teams independently defined several RPC calls. Both wanted to 
cover this usecase:

We have situation when command did not do what the caller wanted. For 
example (it is just an example, we do not have such code):

service Users {
  rpc Login(loginRequest) returns (loginResponse) {
  }
}

message loginRequest {
  string username = 1;
  string password = 2;
  string super_secret1 = 3;
  string super_secret2 = 4;
}

message loginResponse {
...
}

They want to handle some application-level errors. Each error itself brings 
more than just Error Code + String. For example, it brings fields that must 
be filled in to go on. Teams converged to this loginResponse

message loginResponse {
  message Success {
    string token = 1;
    int some_param = 2;
  }

  message  Secret1Needed {
    params of this requirement
  }

  message  Secret2Needed {
    params of this requirement
  }

  oneof result {
    Secret1Needed error1 = 1;
    Secret2Needed error2 = 2;
    Success success = 3;
  }
}

Only token returned is considered as good result (because it actually 
performed Login). In the opposite case, there might be more than one reason 
to fail. The context of failure (beyond the verbosity of Status Code + 
Message) is transferred in specialized messages (here Secret1Needed and 
Secret2Needed).

In the code, they just handle it as a switch:

switch (loginResponse.result_case()) {
  case ERROR1: %handler ...
  case ERROR2: %handler ...
  case SUCCESS: %handler ...
}

I do not like that. Even worse, to allow for changes, every CommandResponse 
message now contains oneof(ERROR1, 2, 3..., SUCCESS)

If google wanted to use GRPC like this, they would have defined ERROR and 
SUCCESS messages instead of commandResponse. However, both teams ended up 
with this solution. Is there something I am missing? How to handle 
application-level errors with more context? And how to handle typed 
contexts (we wanted them to be protobuf messages as well).

Thank you


-- 
You received this message because you are subscribed to the Google Groups 
"grpc.io" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/grpc-io.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/grpc-io/09e38373-3190-4bcd-a4b9-920ea383a2e5%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to