Mux.Vars not working

I work on HTTPS (port 10443) and use routines:

mainRoute := mux.NewRouter() mainRoute.StrictSlash(true) mainRoute.Handle("/", http.RedirectHandler("/static/", 302)) mainRoute.PathPrefix("/static/").Handler(http.StripPrefix("/static", *fh)) // Bind API Routes apiRoute := mainRoute.PathPrefix("/api").Subrouter() apiProductRoute := apiRoute.PathPrefix("/products").Subrouter() apiProductRoute.Handle("/", handler(listProducts)).Methods("GET") 

And functions:

 func listProducts(w http.ResponseWriter, r *http.Request) (interface{}, *handleHTTPError) { vars := mux.Vars(r) productType, ok := vars["id"] log.Println(productType) log.Println(ok) } 

ok is false and I have no idea why. I am doing simple ?type=model after my url.

+5
source share
2 answers

When you enter a URL like somedomain.com/products?type=model , you are specifying a query string, not a variable.

Query strings in Go are accessible through r.URL.Query - for example,

 vals := r.URL.Query() // Returns a url.Values, which is a map[string][]string productTypes, ok := vals["type"] // Note type, not ID. ID wasn't specified anywhere. var pt string if ok { if len(productTypes) >= 1 { pt = productTypes[0] // The first `?type=model` } } 

As you can see, this can be a little awkward, as it must take into account the empty value of the map and the possibility of a URL such as somedomain.com/products?type=model&this=that&here=there&type=cat , where the key can be specified more than once .

For gorilla / mux documents, you can use route variables:

  // List all products, or the latest apiProductRoute.Handle("/", handler(listProducts)).Methods("GET") // List a specific product apiProductRoute.Handle("/{id}/", handler(showProduct)).Methods("GET") 

Here you can use mux.Vars :

 vars := mux.Vars(request) id := vars["id"] 

Hope this helps clarify. I would recommend using variables if you don't need to use query strings.

+19
source

An easier way to solve this problem is to add query parameters to your route through Queries , for example:

 apiProductRoute.Handle("/", handler(listProducts)). Queries("type","{type}").Methods("GET") 

You can get it using:

 v := mux.Vars(r) type := v["type"] 

NOTE. It might not have been possible when the question was originally posted, but I came across this when I ran into a similar problem and the gorilla docs helped.

0
source

All Articles