在GRPC中错误响应的正确方法?

时间:2019-12-04 08:04:05

标签: go grpc grpc-go

我尝试找出通过grpc报告服务器错误的方法。我要实现的是冗长且静态定义的错误,足以告诉客户实际发生了什么。

想象一下我有下一个请求:

message UpdateEmailRequest {
  string email = 1;
}

message UpdateEmailResponse {
}

然后,我试图使错误更加冗长,因为状态代码不会告诉客户错误的详细信息。您可以使用FieldViolation,但它仅指定字段,而不以静态方式指定错误。您可以为这些Description提供FieldViolations,但是客户端需要处理字符串错误并以某种方式将其映射到内部客户端错误,或者客户端直接显示这些错误,这在某些情况下不起作用,因为业务逻辑会因错误类型而异。

我发明的是:

message UpdateEmailResponse {
  enum ErrorCode {
    UNKNOWN_ERROR = 0;
    INVALID_EMAIL_LENGTH = 1;
    INVALID_EMAIL_FORMAT = 2;
    INVALID_EMAIL_TEMPORARY_MAIL_NOT_ALLOWED = 3; //temporary mail services
    INVALID_EMAIL_ALIAS = 4; // email is alias or redirect, not the actual email
    INVALID_EMAIL_FORBIDDEN_WORDS = 5; // for email with bad language
    ...
  }

  message Body {}

  oneof response {
    ErrorCode error_code = 1;
    Body body = 2;
  }
}

通过这种方式,您可以让客户知道与状态代码结合的特定错误,但是它不使用现成的FieldViolations,它看起来像是非grpc的错误处理方式。

其他解决方案是将json嵌入错误代码(我仍然可以在请求实体中定义)并将错误msg嵌入FieldViolations的{​​{1}}内,但同样, grpc方式。

所以,我在grpc中遇到错误,您能告诉我正确的方法吗?

谢谢。

0 个答案:

没有答案