HTTP Server Basics
Use net/http package and useful third-party packages by building simple servers.
Building a Simple Server
package mainimport ( "fmt" "net/http")func hello(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello %s\n", r.URL.Query().Get("name"))}func main() { http.HandleFunc("/hello", hello) http.ListenAndServe(":8000",nil)}
Run the above program and test it.
curl -i http://localhost:8000/hello?name=eric
You can also use http.ListenAndServeTLS(), which will start a server using HTTPS and TLS.
Build a Simple Router
package mainimport ( "fmt" "net/http")type router struct {}func (r *router) ServeHTTP(w http.ResponseWriter, req *http.Request) { switch req.URL.Path { case "/a": fmt.Fprintf(w, "Executing /a\n") case "/b": fmt.Fprintf(w, "Executing /b\n") case "/c": fmt.Fprintf(w, "Executing /c\n") default: http.Error(w, "404 Not Found", 404) }}func main() { var r router http.ListenAndServe(":8000", &r)}
Test the above program by the following commands.
curl http://localhost:8000/acurl http://localhost:8000/d
Building simple Middleware
A simple middleware, which is a sort of wrapper that will execute on all incoming requests regardless of the destination function.
package mainimport ( "fmt" "log" "net/http" "time")type logger struct { Inner http.Handler}func (l *logger) ServeHTTP(w http.ResponseWriter, r *http.Request) { log.Printf("start %s\n", time.Now().String()) l.Inner.ServeHTTP(w,r) log.Printf("finish %s",time.Now().String())}func hello(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, "Hello\n")}func main() { f := http.HandlerFunc(hello) l := logger{Inner: f} http.ListenAndServe(":8000", &l)}
Run the program and issue a request.
curl http://localhost:8000