A "hello world" web server with Chi
The standard library is great for building simple HTTP servers. But if you want to add complex routing logic, we recommend the Chi library. It adds a bunch of great functions, and a router, that all use the standard library.
A router or mulitplexer is included by default in Go, it's called http.ServeMux
and if you don't declare a router, http.DefaultServeMux
is used by default. While Go's http.ServeMux
is great, it doesn't allow two common types of request pattern matching: HTTP Method and variables. Chi adds these and a bunch of other things. Let's update our server.go
file to contain the following code instead of what we originally wrote before:
package main
import (
"log"
"net/http"
"os"
"github.com/go-chi/chi"
)
func main() {
// Get port from env variables or set to 8080.
port := "8080"
if fromEnv := os.Getenv("PORT"); fromEnv != "" {
port = fromEnv
}
log.Printf("Starting up on http://localhost:%s", port)
r := chi.NewRouter()
r.Get("/", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("hello world."))
})
log.Fatal(http.ListenAndServe(":"+port, r))
}
Some changes to this code block from the first. We have added a simple if statement to get the port to run on from an environment variable called PORT
. Next we have r := chi.NewRouter()
. The reason we are using Chi is to get a Router. r
is an instance of Chi's router, which will receive every HTTP request to the server. The line log.Fatal(http.ListenAndServe(":"+port, r))
sets up our server to listen on the port we defined, and send everything to the router we created. It logs any errors and exits if the server returns anything.
We use the Chi Router for two reasons. The first is that it is compatible with the Go standard library package net/http
. There are a bunch of HTTP frameworks out there, but all of the easiest-to-use ones integrate with net/http
, because it provides so much for free. Another router that supports net/http
is Gorilla's Mux.
If you write code that works with net/http
, like Chi does, you can switch between frameworks easily depending on what features you need. You also have a consistent API for people writing middleware or handlers for you. For example, all of Chi's router functions take a function with definition func(w http.ResponseWriter, r *http.Request)
, which is the exact same as net/http
's HandlerFunc
definition:
This page is a preview of Reliable Webservers with Go