Writing a basic HTTP server is easy using the `net/http` package. | package main |
|
import ( |
||
"fmt" |
||
"net/http" |
||
) |
||
A fundamental concept in `net/http` servers is *handlers*. A handler is an object implementing the `http.Handler` interface. A common way to write a handler is by using the `http.HandlerFunc` adapter on functions with the appropriate signature. | func hello(w http.ResponseWriter, req *http.Request) { |
|
Functions serving as handlers take a `http.ResponseWriter` and a `http.Request` as arguments. The response writer is used to fill in the HTTP response. Here our simple response is just "hello\n". | fmt.Fprintf(w, "hello\n") |
|
} |
||
func headers(w http.ResponseWriter, req *http.Request) { |
||
This handler does something a little more sophisticated by reading all the HTTP request headers and echoing them into the response body. | for name, headers := range req.Header { |
|
for _, h := range headers { |
||
fmt.Fprintf(w, "%v: %v\n", name, h) |
||
} |
||
} |
||
} |
||
func main() { |
||
We register our handlers on server routes using the `http.HandleFunc` convenience function. It sets up the *default router* in the `net/http` package and takes a function as an argument. | http.HandleFunc("/hello", hello) |
|
http.HandleFunc("/headers", headers) |
||
Finally, we call the `ListenAndServe` with the port and a handler. `nil` tells it to use the default router we've just set up. | http.ListenAndServe(":8090", nil) |
|
} |