DEV Community

Cover image for Spin a Framework-Free HTTP Router Server in Go 1.22 With Ease
prakash chokalingam
prakash chokalingam

Posted on

15 1

Spin a Framework-Free HTTP Router Server in Go 1.22 With Ease

Transitioning from Node.js or Python development, you're likely familiar with the convenience of frameworks like Express or Flask for spinning up HTTP servers with rich routing capabilities. Similarly, in the Go ecosystem, frameworks such as Gin and Gorilla/Mux have been the go-to solutions for developers seeking to implement efficient routing within their applications.

However, the landscape has evolved with the release of Go 1.22. The net/http package, a staple for network-related operations in Go, has received significant enhancements, particularly in its routing capabilities. This evolution means that developers can now implement complex HTTP servers without relying on external frameworks, streamlining the development process and reducing dependency overhead.

Here's how to build a simple todo application using the net/http server mux.

package main

import (
    "fmt"
    "net/http"
)

func main() {
    router := http.NewServeMux()

    router.HandleFunc("POST /todos", func(w http.ResponseWriter, r *http.Request) {
        fmt.Println("create a todo")
    })

    router.HandleFunc("GET /todos", func(w http.ResponseWriter, r *http.Request) {
        fmt.Println("get all todos")
    })

    router.HandleFunc("PATCH /todos/{id}", func(w http.ResponseWriter, r *http.Request) {
        id := r.PathValue("id")
        fmt.Println("update a todo by id", id)
    })

    router.HandleFunc("DELETE /todos/{id}", func(w http.ResponseWriter, r *http.Request) {
        id := r.PathValue("id")
        fmt.Println("delete a todo by id", id)
    })

    http.ListenAndServe(":8080", router)
}

Enter fullscreen mode Exit fullscreen mode

You can also create a route that matches exactly or uses a wildcard for flexible matching.

// wild card
router.HandleFunc("PATCH /todos/{rest...}", func(w http.ResponseWriter, r *http.Request) {
  rest := r.PathValue("rest")
  fmt.Println("wild card route", rest)
})

// exact match
router.HandleFunc("/todos/{$}", func(w http.ResponseWriter, r *http.Request) {
  fmt.Fprint(w, "exact match")
})

Enter fullscreen mode Exit fullscreen mode

For more details deep dive into the official go documentation https://pkg.go.dev/net/http#ServeMux.

Sentry image

Hands-on debugging session: instrument, monitor, and fix

Join Lazar for a hands-on session where you’ll build it, break it, debug it, and fix it. You’ll set up Sentry, track errors, use Session Replay and Tracing, and leverage some good ol’ AI to find and fix issues fast.

RSVP here →

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay