Перенаправить на другую конечную точку после вызова функции - PullRequest
0 голосов
/ 03 марта 2020

У меня есть подчиненный маршрутизатор с префиксом /api/a, и я хочу перенаправить все запросы на повторное назначение с префиксом api/b/{aid} на api/a после вызова функции (которая устанавливает контекст.) Как этого добиться?

Когда есть звонок на /api/a/<whatever>, я беру помощь от куки и добавляю в контекст запроса, но есть другие конечные точки, где куки не содержат параметр aid, поэтому я принимаю его в качестве параметра маршрута. Я хочу, чтобы любой вызов /api/b/{aid}/<whatever> перенаправлялся на /api/a/<whatever> после того, как я установил aid в контексте запроса (из параметра маршрута).

  1. Я абсолютно не хочу использовать перенаправления на стороне клиента, ему не нужно знать.
  2. Также я знаю, что могу напрямую перейти к любой функции с помощью http.Handler. подпись. Это именно то, чего я хочу избежать.
  3. Существует фиксированный набор конечных точек, в которых не будет установлен cook ie (и это предусмотрено, поэтому я не хочу его устанавливать), и этот набор всегда будет с префиксом скажем /api/b/{aid}.

Поскольку существует более 150 конечных точек и обработчиков, уже настроенных для префикса с префиксом /api/a (давайте назовем его A). Есть еще один подчиненный маршрутизатор B с префиксом /api/b/{aid}. Я хочу перенаправить все вызовы в подчиненный маршрутизатор B после вызова функции. Не будет логичным скопировать весь список обработчиков для отдельного подчиненного маршрутизатора, если я хочу точно такую ​​же вещь.

1 Ответ

1 голос
/ 03 марта 2020

Вы не можете установить значение в контексте запроса, затем перенаправить на другой URL-адрес и ожидать получить это значение. Вы должны передать это значение как часть перенаправления, используя параметр запроса или команду cook ie, et c. Или вы можете сделать это без перенаправления и напрямую вызвать обработчик для перенаправленного URL.

Если вы хотите сделать это с поваром ie, вы можете получить aid в обработчике, установить повар ie, содержащий aid с использованием http.SetCookie, и перенаправление с использованием http.Redirect. Другой обработчик должен получить повар ie.

. Если вы хотите сделать это с помощью параметра запроса, вы можете написать URL перенаправления с добавленным параметром запроса, перенаправить с помощью http.Redirect и проанализировать его в другой обработчик.

Если вы хотите сделать это без перенаправления, вы можете получить aid в одном обработчике, поместить его в контекст запроса и напрямую вызвать другой обработчик:

request.WithContext(context.WithValue(request.Context(),key,aid))
otherHandler(writer,request)

Вы можете автоматизировать переадресацию другому абоненту, используя Router.Match с одним обработчиком:

  • Зарегистрировать обработчик для pathprefix /api/b/{aid}/
  • Анализ обработчиков aid
  • Обработчик переписывает URL-адрес /api/a/<remaining path>, устанавливает для него request.URL и использует router.Match для поиска соответствующего пути в /api/a поддереве
  • Обработчик вызывает обработчик для /api/a/<remaining path>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...