Skip to content

Instantly share code, notes, and snippets.

@pamburus
Last active February 19, 2017 19:46
Show Gist options
  • Save pamburus/32d120eecacc8bc73dc77ae9174f8faa to your computer and use it in GitHub Desktop.
Save pamburus/32d120eecacc8bc73dc77ae9174f8faa to your computer and use it in GitHub Desktop.
Gorilla mux routing by queries example.
package main
import (
"fmt"
"net/http"
"github.com/gorilla/mux"
)
type itemHandler struct {
router *mux.Router
}
func (h *itemHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
item := vars["item"]
version := vars["version"]
route := h.getRoute(version)
u, err := route.URL("item", item, "version", version)
if err != nil {
panic(fmt.Sprintf("Failed to make URL with route: %v", err))
}
fmt.Fprintf(w, "Item: %q\n", item)
fmt.Fprintf(w, "Version: %q\n", version)
fmt.Fprintf(w, "Reversed URL: %q\n", u.String())
}
func (h *itemHandler) getRoute(version string) *mux.Route {
name := h.getRouteName(version)
route := h.router.GetRoute(name)
if route == nil {
panic(fmt.Sprintf("Cannot find route %q", name))
}
return route
}
func (h *itemHandler) getRouteName(version string) string {
if version == "" {
return "item"
}
return "item/version"
}
func registerItemHandler(router *mux.Router) {
router.Methods("GET").Handler(&itemHandler{router})
}
// Main function
func main() {
router := mux.NewRouter().StrictSlash(true)
itemsRouter := router.PathPrefix("/items/").Name("items").Subrouter().StrictSlash(true)
itemRouter := itemsRouter.Path("/{item}").Name("item").Subrouter()
registerItemHandler(itemRouter.Queries("version", "{version}").Name("item/version").Subrouter())
registerItemHandler(itemRouter)
err := http.ListenAndServe(":8080", router)
if err != nil {
fmt.Println(err)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment