В чем разница между PathPrefix () и Handle (pathString, ...) в gorilla / mux? - PullRequest
0 голосов
/ 03 июля 2018

Я заметил, что есть два способа указать путь в gorilla/mux маршрутизаторе :

r.PathPrefix("/api").Handler(APIHandler)

И

r.Handle("/api", APIHandler)

В чем разница?

Кроме того, я не понимаю разницы между маршрутизатором и маршрутом в контексте gorilla/mux.

PathPrefix() возвращает маршрут с методом Handler(). Однако мы не можем вызвать Handler() на маршрутизаторе, мы должны вызвать Handle().

Посмотрите на следующий пример:

r.PathPrefix("/").Handler(http.FileServer(http.Dir(dir+"/public")))

Я пытаюсь обслуживать статические файлы из общего каталога. Вышеупомянутое выражение работает без каких-либо проблем. Мой HTML и JavaScript обслуживаются как ожидалось. Однако, как только я добавлю что-то к пути, например,

r.PathPrefix("/home").Handler(http.FileServer(http.Dir(dir+"/public")))

Тогда я получаю 404, ошибка не найдена на localhost:<port>/home.

1 Ответ

0 голосов
/ 04 июля 2018

Маршрутизатор против Маршрута

Router - это контейнер, в котором вы можете зарегистрировать несколько Route экземпляров. Интерфейс Route в значительной степени реплицируется на Router, что позволяет легко создавать Route экземпляров в Router.

Обратите внимание, что все методы Router, которые имеют то же имя, что и метод Route, являются обертками вокруг Router.NewRoute(), что возвращает новый Route, зарегистрированный в экземпляре Router ,

Для сравнения, когда вы вызываете такие методы в существующем экземпляре Route, он возвращает тот же экземпляр для цепочки вызовов методов.

PathPrefix () и Path ()

Когда вы указываете путь, используя PathPrefix(), он имеет неявный подстановочный знак в конце.

Цитата из обзорного раздела документации :

Обратите внимание, что путь к PathPrefix () представляет собой «подстановочный знак»: вызов PathPrefix ("/ static /"). Handler (...) означает, что обработчику будет передан любой запрос, который соответствует "/ static / * ».

С другой стороны, когда вы указываете путь с помощью Path(), такой подразумеваемый подстановочный суффикс отсутствует.

Router.Handle () против Router.Path (). Handler ()

Router.Handle() является сокращением и, следовательно, эквивалентно выполнению Router.Path() с последующим вызовом Route.Handler() для возвращенного Route.

Обратите внимание, что это не то же самое , как при вызове Router.PrefixPath() с последующим вызовом Route.Handler, поскольку Router.Handle() не предоставляет подстановочный суффикс.

Обслуживание файлов по пути с префиксом

Для вашего последнего примера попробуйте изменить:

r.PathPrefix("/home").Handler(http.FileServer(http.Dir(dir+"/public")))

Кому:

r.PathPrefix("/home/").Handler(http.StripPrefix("/home/", http.FileServer(http.Dir(dir+"/public"))))

В противном случае он пытается обслужить файлы из dir + "/public" + "/home/"

Примером этого является документация, в середине обзора .

...