我试图找出通过 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 方式来处理错误。
FieldViolations
其他解决方案是在's中嵌入带有错误代码(我仍然可以在请求实体中定义)和错误消息的 json Description
,但同样,它看起来像非 grpc 方式。
所以,我在grpc中遇到错误,你能告诉我正确的方法吗?
谢谢。