Я реализую собственные ошибки на моем сервере gRPC, написанном на Go.На этом сервере у меня есть два клиента, один в Go и один в Objective-C.Сообщение об ошибке зависит от Google API и выглядит следующим образом:
message Status {
// The status code, which should be an enum value of [google.rpc.Code].
int32 code = 1;
// A developer-facing error message, which should be in English. Any
// user-facing error message should be localized and sent in the
// [google.rpc.Status.details][google.rpc.Status.details] field, or localized by the client.
string message = 2;
// A list of messages that carry the error details. There is a common set of
// message types for APIs to use.
repeated google.protobuf.Any details = 3;
}
ссылка: https://cloud.google.com/apis/design/errors
Я пытаюсь разобрать ошибку в Objective-C, но не могунайдите, как разобрать поле details в объекте NSERROR.
Вот пример моего клиентского кода на Go:
rsp, err := cl.Hello(context.TODO(), &hello.Request{
Name: "John",
})
if err != nil {
if e, ok := status.FromError(err); ok {
var ee *errors_v1.ExternalError
if len(e.Details()) > 0 {
if ee, ok = e.Details()[0].(*errors_v1.ExternalError); ok {
fmt.Printf("Extra information: %v\n", ee.GetExtra())
}
}
return
}
}
Я могу получить код исообщение, но поле подробностей выглядит как поток байтов, который невозможно разобрать.Я вижу, что ответ об ошибке имеет grpc-status-details-bin.
"grpc-status-details-bin" = <0803120a 42616420 696e7075 742e1a46 0a2b7479 70652e67 6f6f676c 65617069 732e636f 6d2f6572 726f7273 2e76312e 45787465 726e616c 4572726f 72121708 c0b80212 05656e2d 55531a0a 42616420 696e7075 742e>
и при преобразовании HEX в ASCII ("...Bad input.F
+type.googleapis.com/errors.v1.ExternalErrorÀ¸en-US
Bad input."
) он обнаруживает некоторые детали, но все еще не может преобразоваться в мой объект Error.