2015-02-05 8 views
0

У меня есть следующие маршруты:Gorilla Mux для суб пути маршрутизации

router.Methods("POST").Path("/my_post_01").HandlerFunc(myHandler1) 
router.Methods("GET").Path("/my_get_01").HandlerFunc(myHandler2) 

router.Methods("POST").Path("/my_post_02").HandlerFunc(myHandler3) 
router.Methods("GET").Path("/my_get_02").HandlerFunc(myHandler4) 

router.Methods("POST").Path("/my_post_03").HandlerFunc(myHandler5) 
router.Methods("GET").Path("/my_get_03").HandlerFunc(myHandler6) 

router.Methods("POST").Path("/my_post_04").HandlerFunc(myHandler7) 
router.Methods("GET").Path("/my_get_04").HandlerFunc(myHandler8) 

router.Methods("POST").Path("/my_post_05").HandlerFunc(myHandler9) 
router.Methods("GET").Path("/my_get_05").HandlerFunc(myHandler10) 

Как я все больше и больше маршрутов, становится все труднее управлять.

Я хочу сделать что-то вроде:

router.Path("/my/*").HandleFunc(mypackage.RegisterHandler) 

с все обработчики разделены в другом пакете

Есть ли способ, что я могу соответствовать этим пути в отдельном пакете?

Спасибо,

+0

... вы пробовали, что вы положили Вот? Нет ничего, что помешало бы вам передать http.HandlerFunc, который находится в другом пакете, на ваш маршрутизатор ... –

ответ

2

Вы могли бы создать пакет для вашего маршрутизатора, то импорт сказал пакет и добавить свои маршруты.

маршрутизатор

package router 

var Router = mux.NewRouter() 
// handle "/my/" routes 
var MyRouter = Router.PathPrefix("/my").Subrouter() 

другой пакет

import "/path/to/router" 

func init() { 
    router.MyRouter.Methods("POST").Path("/post_01").HandlerFunc(myHandler1) 
} 

В основной

import "/path/to/router" 

func main() { 
    http.Handle("/", router.Router) 

    //... 
} 
+0

Тогда как мне избежать префикса 'my_' для каждого обработчика? –

+0

@ cvxv31431asdas Я добавил пример подпроцессора. Он не позволяет вам добавлять 'my_', но он допускает префикс пути'/my/'. – jmaloney

+0

Спасибо! Оно работает! –

1

Было бы намного лучше, если бы вы могли извлечь id из запроса URL и обработать его в общий обработчик.

На самом деле, это не так далеко от того, где вы находитесь прямо сейчас, измените вы маршрутизатор, как это:

r := mux.NewRouter() 
r.Methods("POST").HandleFunc("/articles/{article_id:[0-9]+}", ArticlePostHandler) 

article_id это имя параметра и [0-9]+ является регулярное выражение, чтобы соответствовать этому.

И в ArticlePostHandler (вы можете импортировать его из другого пакета), использовать mux.Vars, чтобы получить идентификатор, например:

func ArticlePostHandler(resp http.ResponseWriter, req *http.Request) { 
    articleId := mux.Vars(req)["article_id"] 
    // do whatever you want with `articleId` 
} 

Документ: http://www.gorillatoolkit.org/pkg/mux