Как отфильтровать некоторый путь от gorilla mux.Router

Я хотел бы сопоставить только некоторые маршруты из mux.Router и использовать один и тот же обработчик для всех остальных. Как я могу это сделать?

то есть: имея эти пути:

/general/baz/bro
/general/foo/bar
/general/unknown

Я хотел бы сопоставить первый с конкретным обработчиком, а все остальные с обработчиком по умолчанию.

Я безуспешно пробовал что-то вроде:

r.Methods("GET").PathPrefix("/general").Handler(defaultHandler)
r.Methods("GET").Path("/general/baz/bro").Handler(bazBroHandler)

Я ожидал, что bazBroHandler будет обрабатывать путь /general/baz/bro, а defaultHandler — все остальные, начиная с /general.


person Enrichman    schedule 20.07.2017    source источник
comment
Вы можете попробовать регулярное выражение. Я полагаю, это не идеоматический способ, но, возможно, он мог бы помочь: get := repo.Methods("GET").Subrouter() get.Handle("/general/baz/bro", bazBroHandler) get.Handle("/general/{unknown:[0-9A-Za-z]+}", defaultHandler)   -  person bayrinat    schedule 20.07.2017


Ответы (2)


Один из способов добиться этого — использовать MatcherFunc. В MatcherFunc сравните/проверьте входящий запрос Path, т.е.:

//Default handler
r.MatcherFunc(func(r *http.Request, rm *mux.RouteMatch) bool {
    return r.URL.Path != "/general/baz/bro" && strings.HasPrefix(r.URL.Path, "/general") && r.Method == "GET"
}).Handler(defaultHandler)

//Specific handler
r.Methods("GET").Path("/general/baz/bro").Handler(bazBroHandler)
person putu    schedule 20.07.2017

В конце концов я только что понял, что мне нужно инвертировать порядок:

r.Methods("GET").Path("/general/baz/bro").Handler(bazBroHandler)
r.Methods("GET").PathPrefix("/general").Handler(defaultHandler)

теперь все работает!

person Enrichman    schedule 24.07.2017