В чем разница между PathPrefix() и Handle(pathString, ) в gorilla/mux?

Я заметил, что есть два способа указать путь в 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.


person mofury    schedule 03.07.2018    source источник


Ответы (1)


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

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")))

To:

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

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

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

person chuckx    schedule 04.07.2018