Разобрать ошибку gRPC в target-c - PullRequest
0 голосов
/ 26 августа 2018

Я реализую собственные ошибки на моем сервере 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.

...