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:

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

No discussions yet. Be the first. All notification go to the author.