Golang получить запрос вне функции обработчика - PullRequest
0 голосов
/ 08 апреля 2020

Есть ли возможность получить текущий объект запроса (структуру) вне http.HandlerFun c? Я сталкиваюсь с проблемой, что мне нужен уникальный случайный ха sh только для запроса, я не могу использовать глобальную переменную, потому что в случае, если мое приложение будет обрабатывать 2 или более запросов одновременно, каждый запрос будет переопределять значение глобальной переменной.

Я понял, что могу использовать контекст следующим образом:

func Init() Middleware {
    return func(next http.Handler) http.Handler {
        return http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) {
            ctx := context.WithValue(request.Context(), "requestId", GetRequestHash())

            next.ServeHTTP(writer, request.WithContext(ctx))
        })
    }
}

Затем в HandlerFun c я могу получить этот уникальный ха sh

request.Context().Value("requestId")

, но проблема в том, что мне нужно это значение очень глубоко в моем приложении, и я не могу просто передать это ha sh параметром. У меня уже есть много обработчиков, и эти обработчики вызывают функцию, которая вызывает другую ... Мне нужно что-то вроде http.GetCurrentRequest где-то за пределами HandlerFun c, чтобы получить контекст запроса и, наконец, получить requestId (уникальный ha sh для запроса).

Очевидно, я не могу просто сохранить это значение ha sh как глобальную переменную, поскольку оно будет переопределено другим запросом ...

1 Ответ

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

Я думаю, что вы ищете локальный эквивалент , который не поддерживается в Go. Существуют пакеты, которые выполняют локальное хранение потоков, но я не хочу рекомендовать их, потому что команда Go рекомендует контексты (см. Ссылку ниже).

Некоторые альтернативные (и не обязательно хорошие) опции

  • Сохраните ha sh в некотором коде go (используя соответствующие блокировки для сценария параллелизма ios).
  • Используйте хранилище данных (например, Redis) для хранения этих значений.

Предпочтительная опция - используйте пакет context

В блоге разработчиков go пакет context был специально разработан для этого сценария. Это позволяет разработчику передавать значения (например, ha sh, упомянутые в потоке), а также возможность отмены контекста (тем самым отменяя базовую процедуру), когда запросы слишком длинные для конкретного варианта использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...