Search code examples
gourl-routinggorilla

Gorilla mux can't separate two routes


I am using Gorilla and i discovered that gorilla router can't resolve two routes. I am using trailing slash at the end of each URL. Consider following routing table:

    router := mux.NewRouter()
    baseUri, _ := stringFormatter.Format("/api/{0}", apiVersion)
    // function resource
    router.HandleFunc(baseUri + "/function/", webApiContext.GetAllFunctions).Methods("GET")
    router.HandleFunc(baseUri + "/function/find/", webApiContext.FindFunctions).Methods("GET").Queries("query", "{query}")
    router.HandleFunc(baseUri + "/function/{id}/", webApiContext.GetFunctionById).Methods("GET")
    router.HandleFunc(baseUri + "/function/{id}/body/", webApiContext.GetFunctionBodyById).Methods("GET")
    router.HandleFunc(baseUri + "/function/", webApiContext.CreateFunction).Methods("POST")
    router.HandleFunc(baseUri + "/function/{id}/", webApiContext.UpdateFunction).Methods("PUT")
    router.HandleFunc(baseUri + "/function/{id}/", webApiContext.DeleteFunction).Methods("DELETE")

Gorilla can't separate these two routes GET /function/{id}/ and GET /function/find/?query={query}. If I am placing a find method above getting function by id, find handler invokes for the both find & get function by id URLs.

This could be resolved by remove trailing slash from one of these URLs i.e for find URL declaration. But I am have to use StrictSlash(true) function that makes unable to use that hack with URL declaration.

Could you please help to solve issue with proper URL declaration.


Solution

  • As @Hymns For Disco noticed to solve this issue we have to path variable check inside curved bracket using regular expressions, therefore proper routing table should look like^

        router.HandleFunc(baseUri + "/function/", webApiContext.GetAllFunctions).Methods("GET")
        router.HandleFunc(baseUri + "/function/find/", webApiContext.FindFunctions).Methods("GET").Queries("query", "{query}")
        router.HandleFunc(baseUri + "/function/{id:[0-9]+}/", webApiContext.GetFunctionById).Methods("GET")
        router.HandleFunc(baseUri + "/function/{id:[0-9]+}/body/", webApiContext.GetFunctionBodyById).Methods("GET")
        router.HandleFunc(baseUri + "/function/", webApiContext.CreateFunction).Methods("POST")
        router.HandleFunc(baseUri + "/function/{id:[0-9]+}/", webApiContext.UpdateFunction).Methods("PUT")
        router.HandleFunc(baseUri + "/function/{id:[0-9]+}/", webApiContext.DeleteFunction).Methods("DELETE")