Передача пользовательского прото-сообщения с помощью WithDetails () из пакета состояния gRP C - PullRequest
1 голос
/ 20 апреля 2020

Я недавно экспериментировал с обработкой ошибок gRP C и хотел передать свое собственное прототипное сообщение клиенту (определяя мои собственные детали ошибок и внутренние коды ошибок). После поиска, нашел пару примеров, которые используют WithDetails () в пакете состояния gRP C для прикрепления пользовательских метаданных. Я начал реализовывать то же самое, как показано ниже:

gRP C прото-сообщение

message ErrorInfo {
    int64 error_code = 1;
    string error_message = 2;
    string resource_name = 3;
}

Реализация на стороне сервера

// Frame the error message
        st := status.New(codes.NotFound, "object not found")
        errInfo := &api.ErrorInfo {
            ErrorCode: 100,
            ErrorMessage: "Fetching credential failed",
            ResourceName: req.GetBackupLocation().GetCloudCredential(),
        }
        var err error
        st, err = st.WithDetails(errInfo)
        if err != nil {
            // If this errored, it will always error
            // here, so better panic so we can figure
            // out why than have this silently passing.
            panic(fmt.Sprintf("Unexpected error attaching metadata: %v", err))
        }

        return  st.Err()

Реализация на стороне клиента

fmt.Printf("line 76 err :%v", err)
                st := status.Convert(err)
                for _, detail := range st.Details() {
                    switch t := detail.(type) {
                    case *api.ErrorInfo:
                        fmt.Printf("error code: %v", t.GetErrorCode())
                        fmt.Printf("error msg: %v", t.GetErrorMessage())
                        fmt.Printf("resource name: %v", t.GetResourceName())
                    }
                }

Когда я запускаю код, он нажимает на Pani c (), добавленную в код сервера, что означает ошибку WithDetails ().

Для продолжения, удалил pani c на стороне сервера , с этим клиентом выдает следующую ошибку

:any: message type "" isn't linked inerror

Вопросы:

  • Работает ли WithDetails () только для стандартного определения gRP C gRap * / rpc / errdetails, а не с custom proto?
  • Глядя на файлы proto и реализацию кода, я не вижу ничего, что определило c to gRP C errdetails package.

  • Когда я пытался с прототипом сообщения из этого пакета, он работал нормально.

[Примечание: я использую gogo protobuf]

Может любой один, пожалуйста, дайте знать, что я здесь скучаю?

1 Ответ

0 голосов
/ 27 апреля 2020

С моей точки зрения, смешивать бизнес-логи c с ошибками транспорта не следует считать хорошей практикой, даже если GRP C API это позволяет. Добавление специальной структуры Result или Error к каждому ответу (с вашим собственным набором полей и кодов) является гораздо более понятным и гибким способом сообщения о состоянии обработки запроса.

...