Go-grpc-gateway: как объединить несколько ошибок http

в grpc-gateway, как мы можем связать несколько обработчиков ошибок

например, это будет выглядеть так

import "github.com/grpc-ecosystem/grpc-gateway/runtime"

    //first error handler
    var runTimeError1 = func(ctx context.Context, mux *runtime.ServeMux, marshaler runtime.Marshaler, w http.ResponseWriter, r *http.Request, err error) {
            
            stat, ok := status.FromError(err)
            fmt.Println("body")
            if !ok || len(stat.Details()) != 1 {
                fmt.Println("in unknown error")
            }
            statusCode := runtime.HTTPStatusFromCode(stat.Code())
            fmt.Println("code", statusCode)
        }
    // another error handler
    var runTimeError2 = func(ctx context.Context, mux *runtime.ServeMux, marshaler runtime.Marshaler, w http.ResponseWriter, r *http.Request, err error) {
            
            stat, ok := status.FromError(err)
            fmt.Println("body")
            if !ok || len(stat.Details()) != 1 {
                fmt.Println("in unknown error")
            }
            statusCode := runtime.HTTPStatusFromCode(stat.Code())
            fmt.Println("code", statusCode)
        }
    
    runtime.HTTPError = runTimeError1

Что мне нужно, так это объединить обе ошибки в цепочку что-то вроде этого runtime.HTTPError = [runTimeError1,runTimeError2]

Возможна ли вышеуказанная реализация в grpc-gateway??

Какого поведения вы ожидаете? Разные обработчики для разных ошибок? Или оба обработчика что-то делают с ошибкой? В общем, вы можете объединить/связать обработчики ошибок в один обработчик и назначить его.

NotX 24.04.2024 15:26

@NotX, я хотел бы объединить обработчики ошибок, например, один обработчик будет регистрировать ошибку в файлах или каком-либо другом сборщике журналов, а другой обработчик ошибок будет обрабатывать ошибки для конечного пользователя (выходные данные API остальных)

shamon shamsudeen 25.04.2024 05:55
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
0
2
70
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете объединить все обработчики в один. Вот немного переработанный пример:

type ErrHandler func(ctx context.Context, mux *runtime.ServeMux, marshaler runtime.Marshaler, w http.ResponseWriter, r *http.Request, err error)
type ChainedErrHandler []ErrHandler

func (c ChainedErrHandler) Merge() ErrHandler {
    return func(ctx context.Context, mux *runtime.ServeMux, marshaler runtime.Marshaler, w http.ResponseWriter, r *http.Request, err error) {
        for _, handler := range c {
            handler(ctx, mux, marshaler, w, r, err)
        }
    }
}

func main() {
    var runTimeError1 ErrHandler = func(ctx context.Context, mux *runtime.ServeMux, marshaler runtime.Marshaler, w http.ResponseWriter, r *http.Request, err error) {
        fmt.Println("handling error", err, "in handler 1")
    }
    var runTimeError2 ErrHandler = func(ctx context.Context, mux *runtime.ServeMux, marshaler runtime.Marshaler, w http.ResponseWriter, r *http.Request, err error) {
        fmt.Println("handling error", err, "in handler 2")
    }
    chainedHandlers := ChainedErrHandler{runTimeError1, runTimeError2}.Merge()
    runtime.HTTPError = chainedHandlers
}

Спасибо за ответ, попробую

shamon shamsudeen 25.04.2024 10:48

@shamonshamsudeen Всегда пожалуйста! Если вам нужны дополнительные разъяснения, не стесняйтесь спрашивать. Если вы этого не сделаете и ваша проблема решена, отметьте этот ответ как «принятый». ;)

NotX 27.04.2024 16:43

Другие вопросы по теме