Implementing HTTP request routing using Gorilla Mux
Go’s net/http
package offers a lot of functionalities for URL routing of the HTTP requests. One thing it doesn’t do very well is dynamic URL routing. Fortunately, we can achieve this with the gorilla/mux
package, which we will be covering in this recipe.
How to do it…
In this recipe, we will use gorilla/mux
to define a few routes, like we did in our previous recipe, along with their handlers or resources. As we have already seen in one of our previous recipes, to use external packages, first we have to install the package using the go get
command or we have to copy it manually to $GOPATH/src
or $GOPATH
. We will do the same in the recipe as well. Perform the following steps:
- Install
github.com/gorilla/mux
using thego get
command, as follows:
$ go get github.com/gorilla/mux
- Create
http-server-gorilla-mux-routing.go
and copy the following content:
package main import ( "net/http" "github.com/gorilla/mux" ) const ( CONN_HOST = "localhost" CONN_PORT = "8080" ) var GetRequestHandler = http.HandlerFunc ( func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("Hello World!")) } ) var PostRequestHandler = http.HandlerFunc ( func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("It's a Post Request!")) } ) var PathVariableHandler = http.HandlerFunc ( func(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) name := vars["name"] w.Write([]byte("Hi " + name)) } ) func main() { router := mux.NewRouter() router.Handle("/", GetRequestHandler).Methods("GET") router.Handle("/post", PostRequestHandler).Methods("POST") router.Handle("/hello/{name}", PathVariableHandler).Methods("GET", "PUT") http.ListenAndServe(CONN_HOST+":"+CONN_PORT, router) }
- Run the program with the following command:
$ go run http-server-gorilla-mux-routing.go
How it works…
Once we run the program, the HTTP server will start locally listening on port 8080
, and accessing http://localhost:8080/
, http://localhost:8080/post
, and http://localhost:8080/hello/foo
from a browser or command line will produce the message defined in the corresponding handler definition. For example, execute http://localhost:8080/
from the command line, as follows:
$ curl -X GET -i http://localhost:8080/
This will give us the following response from the server:

We could also execute http://localhost:8080/hello/foo
from the command line, as follows:
$ curl -X GET -i http://localhost:8080/hello/foo
This will give us the following response from the server:

Let's understand the code changes we made in this recipe:
- First, we defined
GetRequestHandler
andPostRequestHandler
, which simply write a message on an HTTP response stream, as follows:
var GetRequestHandler = http.HandlerFunc ( func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("Hello World!")) } ) var PostRequestHandler = http.HandlerFunc ( func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("It's a Post Request!")) } )
- Next, we defined
PathVariableHandler
, which extracts request path variables, gets the value, and writes it to an HTTP response stream, as follows:
var PathVariableHandler = http.HandlerFunc ( func(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) name := vars["name"] w.Write([]byte("Hi " + name)) } )
- Then, we registered all these handlers with the
gorilla/mux
router and instantiated it, calling theNewRouter()
handler of the mux router, as follows:
func main() { router := mux.NewRouter() router.Handle("/", GetRequestHandler).Methods("GET") router.Handle("/post", PostCallHandler).Methods("POST") router.Handle("/hello/{name}", PathVariableHandler). Methods("GET", "PUT") http.ListenAndServe(CONN_HOST+":"+CONN_PORT, router) }