#6 HTTP server
October 19, 2022We're going to use the native http
module to set up our first endpoint. This is done by creating a handler function.
A handler function takes http.ResponseWriter
and http.Request
arguments. The second argument is passed as a pointer. I don't know why that is. One reason could be that it allows to modify it, although I don't see why we would want to do that to an HTTP request object. A more likely explanation is that passing it by value would lead to copying the entire request object, which might be expensive. I'll update this section once I learn more.
We write the response from the handler using the fmt.Fprintf
method. This method takes as its first parameter an instance of http.ResponseWriter
. The second argument is the response itself.
func getData(w http.ResponseWriter, req *http.Request) { fmt.Fprintf(w, "Hello world\n")}
We register our handler by calling http.HandleFunc()
method, passing the path and the handler itself.
http.HandleFunc("/data", getData)
Finally, we define a port to listen to:
http.ListenAndServe(":8080", nil)
We start the server with go run main.go
command.
We can now visit http://localhost:8080 in our browser. The base path will return a 404 - we haven't defined a handler for this path. When we add /data, we get our response from the getData
handler:
We can also make HTTP requests directly from the command line with cURL:
$ curl http://localhost:8080404 page not found$ curl http://localhost:8080/dataHello world
Here's the complete code of our server:
package main
import ( "fmt" "net/http")
func getData(w http.ResponseWriter, req *http.Request) { fmt.Fprintf(w, "Hello world\n")}
func main() { http.HandleFunc("/data", getData)
http.ListenAndServe(":8080", nil)}