Go > Web Development > HTTP Basics > Routing with mux
Simple HTTP Server with Mux Routing
This code demonstrates how to create a basic HTTP server in Go using the `gorilla/mux` router. It defines multiple routes and handlers for different endpoints, showcasing the fundamental principles of web routing in Go.
Import Necessary Packages
This section imports the required packages. `fmt` is for formatted I/O, `net/http` is for HTTP server functionality, `github.com/gorilla/mux` is for request routing, and `log` for logging any errors.
import (
"fmt"
"net/http"
"github.com/gorilla/mux"
"log"
)
Define Route Handlers
These functions are the handlers for different routes. `homeHandler` handles the `/` route, `aboutHandler` handles the `/about` route, and `articlesHandler` handles routes like `/articles/{id}`. The `articlesHandler` extracts the `id` parameter from the URL using `mux.Vars`.
func homeHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "Welcome to the Home Page!")
}
func aboutHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "This is the About Page.")
}
func articlesHandler(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
articleID := vars["id"]
fmt.Fprintf(w, "Viewing article with ID: %s", articleID)
}
Create the Router and Define Routes
This `main` function creates a new `mux.Router` instance. It then defines the routes and associates them with their respective handlers using `r.HandleFunc`. Finally, it starts the HTTP server, listening on port 8000.
func main() {
r := mux.NewRouter()
r.HandleFunc("/", homeHandler)
r.HandleFunc("/about", aboutHandler)
r.HandleFunc("/articles/{id}", articlesHandler)
fmt.Println("Server listening on port 8000")
log.Fatal(http.ListenAndServe(":8000", r))
}
Complete Code
This is the complete, runnable code for the example.
package main
import (
"fmt"
"net/http"
"github.com/gorilla/mux"
"log"
)
func homeHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "Welcome to the Home Page!")
}
func aboutHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "This is the About Page.")
}
func articlesHandler(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
articleID := vars["id"]
fmt.Fprintf(w, "Viewing article with ID: %s", articleID)
}
func main() {
r := mux.NewRouter()
r.HandleFunc("/", homeHandler)
r.HandleFunc("/about", aboutHandler)
r.HandleFunc("/articles/{id}", articlesHandler)
fmt.Println("Server listening on port 8000")
log.Fatal(http.ListenAndServe(":8000", r))
}
Concepts Behind the Snippet
This snippet showcases several core concepts: HTTP handlers (functions that respond to HTTP requests), routing (mapping URLs to specific handlers), and URL parameter extraction. The `gorilla/mux` library simplifies the process of defining and managing these routes.
Real-Life Use Case Section
In a real-world application, this routing mechanism would be used to handle API endpoints, serve different web pages, process user input, and perform various other tasks based on the requested URL. For example, a REST API would use routing to direct requests to the appropriate resource handler based on the HTTP method (GET, POST, PUT, DELETE) and the resource URL.
Best Practices
Interview Tip
Be prepared to explain the difference between `HandleFunc` and `Handle`. `HandleFunc` takes a function directly, while `Handle` takes an `http.Handler` interface, allowing you to use custom handler types.
When to Use Them
Use `gorilla/mux` (or similar routing libraries) when you need more advanced routing capabilities than the standard `net/http` package provides. This includes features like URL parameters, regular expression matching, and middleware support.
Memory footprint
The memory footprint of this example is relatively small. The `gorilla/mux` router itself adds some overhead, but the primary memory usage comes from the handlers and any data they process. Minimizing the data processed by your handlers will help keep memory usage low.
Alternatives
Alternatives to `gorilla/mux` include:
Pros
Cons
FAQ
-
How do I install the `gorilla/mux` package?
You can install it using the `go get` command: `go get github.com/gorilla/mux` -
How do I define routes with regular expressions?
The `mux` router supports regular expressions in routes. You can use the `r.HandleFunc("/articles/{id:[0-9]+}", articlesHandler)` to only match routes where the `id` parameter is a number. -
How can I handle different HTTP methods for the same route?
You can chain methods to `HandleFunc` to restrict the route to specific HTTP methods: `r.HandleFunc("/", homeHandler).Methods("GET")`