2015-04-07 2 views
0

Так что я пытаюсь настроить маршрутизатор, чтобы ответить на /users и /users/{userId} поэтому я попробовал этот код:вопросы Subrouter с Negroni/горилл мультиплексором

usersRouter := router.PathPrefix("/users").Subrouter() 
usersRouter.HandleFunc("", users.GetUsersRoute).Methods("GET") 
usersRouter.HandleFunc("/{userId:[0-9]*}", users.GetUserRoute).Methods("GET") 

Вопрос заключается в том, что я получаю 404 ошибку, когда я иду /users (но действительно реагирует на /users/) Если я:

router.HandleFunc("/users", users.GetUsersRoute).Methods("GET") 
router.HandleFunc("https://stackoverflow.com/users/{userId:[0-9]*}", users.GetUserRoute).Methods("GET") 

он работает, как я хочу, чтобы это.

Есть ли способ заставить URL-адреса работать, как я хочу, с помощью Subrouters?

ответ

1

Да и нет. Вы можете сделать маршруты полуработками, добавив StrictSlash (true) к маршрутизатору.

Учитывая следующий код

package main 

    import (
     "fmt" 
     "net/http" 

     "github.com/gorilla/mux" 
    ) 

    func main() { 
     mainRouter := mux.NewRouter().StrictSlash(true) 
     mainRouter.HandleFunc("/test", func(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, "test") }) 

     subRouter := mainRouter.PathPrefix("/users").Subrouter() 
     subRouter.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, "/users") }) 
     subRouter.HandleFunc("/{id:[0-9]+}", func(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, "https://stackoverflow.com/users/id") }) 
     http.ListenAndServe(":8080", mainRouter) 
    } 

запрос на http://localhost:8080/users будет возвращать

< HTTP/1.1 301 Moved Permanently 
< Location: /users/ 
< Date: Tue, 07 Apr 2015 19:52:12 GMT 
< Content-Length: 42 
< Content-Type: text/html; charset=utf-8 
< 
<a href="https://stackoverflow.com/users/">Moved Permanently</a>. 

запрос на http://localhost:8080/users/ возвращается

< HTTP/1.1 200 OK 
< Date: Tue, 07 Apr 2015 19:54:43 GMT 
< Content-Length: 6 
< Content-Type: text/plain; charset=utf-8 

< /users 

так что если ваш клиент браузер, то, возможно, это является приемлемым.

Смежные вопросы