router icon indicating copy to clipboard operation
router copied to clipboard

A fast standalone router for Go.

Router

A fast standalone router for Go.

Using https://github.com/cypriss/golang-mux-benchmark, Router was at least 2.5x faster (and up to 382x faster).

Usage

Create, instance, configure your routes, hook into Go's HTTP server:

import (
  "github.com/karlseguin/router"
  "net/http"
  "log"
)

func main() {
  router := router.New(router.Configure())
  router.Get("/users", userList)
  router.Get("/users/:id", userShow)

  s := &http.Server{
    Handler:        router,
  }
  log.Fatal(s.ListenAndServe())
}

func userList(out http.ResponseWriter, req *router.Request) {
  ...
}

func userShow(out http.ResponseWriter, req *router.Request) {
  id := req.Param("id")
  ...
}

Notice that userList and userShow take a *router.Request and not a *http.Request. This is to expose the Param method.

Methods

All methods used to setup a route expect two parameters:

  • path string
  • handler func(res http.ResponseWriter, req *router.Request)

The methods are:

  • Get
  • Post
  • Put
  • Delete
  • Patch
  • Purge
  • Head
  • Options

The convenience method All sets up a route for all methods. This can be overwritten by setting a specific handler before calling All:

router.Get("/power", testHandler("get-9000"))
router.All("/power", testHandler("9000"))

Prefix matches

A route that ends with a '*' will do a prefix match on the incoming URL:

router.Delete("/users/*", users)

Parameter matches are evaluated before prefix matches are considered. Given:

router.Put("/users/:id", userShow)
router.Put("/users/ad*", userDebug)

and a request to /users/ad123, userShow will be executed. However, a request to /users/ad/333 will execute userDebug.

Prefix matching is case insensitive.

Constraints

Constraints can be placed on parameters:

route.Delete("/users/:id(^\\d+$)", userDelete)

You'll very likely always want to bind to the start and end (^ and $), but this isn't automated in order to give you the flexibility of doing a partial match.

The code will panic on an invalid regular expression.

Postfixes

A parameter can be followed by a postfix value, such as an extension:

route.Get("/users/:id:.json", showUser)

404

Specify a handler for not found requests:

router.NotFound(notFound)


func notFound(out http.ResponseWriter, req *router.Request) {
  ...
}

A default not found handler is used if none is provided