2015-10-02 03:24:38 +02:00
|
|
|
---
|
|
|
|
title: Routing
|
|
|
|
menu:
|
2015-10-08 22:54:31 +02:00
|
|
|
side:
|
2015-10-02 03:24:38 +02:00
|
|
|
parent: guide
|
2015-10-06 00:52:07 +02:00
|
|
|
weight: 3
|
2015-10-02 03:24:38 +02:00
|
|
|
---
|
|
|
|
|
2015-10-03 04:48:47 +02:00
|
|
|
Echo's router is [fast, optimized]({{< relref "index.md#performance">}}) and
|
2015-10-02 03:24:38 +02:00
|
|
|
flexible. It's based on [radix tree](http://en.wikipedia.org/wiki/Radix_tree) data
|
|
|
|
structure which makes route lookup really fast. Router leverages [sync pool](https://golang.org/pkg/sync/#Pool)
|
|
|
|
to reuse memory and achieve zero dynamic memory allocation with no GC overhead.
|
|
|
|
|
|
|
|
Routes can be registered by specifying HTTP method, path and a handler. For example,
|
|
|
|
code below registers a route for method `GET`, path `/hello` and a handler which sends
|
|
|
|
`Hello!` HTTP response.
|
|
|
|
|
|
|
|
```go
|
|
|
|
e.Get("/hello", func(c *echo.Context) error {
|
|
|
|
return c.String(http.StatusOK, "Hello!")
|
|
|
|
})
|
|
|
|
```
|
|
|
|
|
2015-10-11 23:15:07 +02:00
|
|
|
You can use `Echo.Any(path string, h Handler)` to register a handler for all HTTP methods.
|
|
|
|
To register it for some methods, use `Echo.Match(methods []string, path string, h Handler)`.
|
|
|
|
|
|
|
|
|
2015-10-02 03:24:38 +02:00
|
|
|
Echo's default handler is `func(*echo.Context) error` where `echo.Context` primarily
|
|
|
|
holds HTTP request and response objects. Echo also has a support for other types
|
|
|
|
of handlers.
|
|
|
|
|
|
|
|
### Match-any
|
|
|
|
|
|
|
|
Matches zero or more characters in the path. For example, pattern `/users/*` will
|
|
|
|
match:
|
|
|
|
|
|
|
|
- `/users/`
|
|
|
|
- `/users/1`
|
|
|
|
- `/users/1/files/1`
|
|
|
|
- `/users/anything...`
|
|
|
|
|
|
|
|
### Path matching order
|
|
|
|
|
|
|
|
- Static
|
|
|
|
- Param
|
|
|
|
- Match any
|
|
|
|
|
|
|
|
#### Example
|
|
|
|
|
|
|
|
```go
|
|
|
|
e.Get("/users/:id", func(c *echo.Context) error {
|
|
|
|
return c.String(http.StatusOK, "/users/:id")
|
|
|
|
})
|
|
|
|
|
|
|
|
e.Get("/users/new", func(c *echo.Context) error {
|
|
|
|
return c.String(http.StatusOK, "/users/new")
|
|
|
|
})
|
|
|
|
|
|
|
|
e.Get("/users/1/files/*", func(c *echo.Context) error {
|
|
|
|
return c.String(http.StatusOK, "/users/1/files/*")
|
|
|
|
})
|
|
|
|
```
|
|
|
|
|
|
|
|
Above routes would resolve in the following order:
|
|
|
|
|
|
|
|
- `/users/new`
|
|
|
|
- `/users/:id`
|
|
|
|
- `/users/1/files/*`
|
|
|
|
|
|
|
|
> Routes can be written in any order.
|
|
|
|
|
|
|
|
### Group
|
|
|
|
|
|
|
|
`Echo.Group(prefix string, m ...Middleware) *Group`
|
|
|
|
|
|
|
|
Routes with common prefix can be grouped to define a new sub-router with optional
|
|
|
|
middleware. If middleware is passed to the function, it overrides parent middleware
|
|
|
|
- helpful if you want a completely new middleware stack for the group. To add middleware
|
|
|
|
later you can use `Group.Use(m ...Middleware)`. Groups can also be nested.
|
|
|
|
|
|
|
|
In the code below, we create an admin group which requires basic HTTP authentication
|
|
|
|
for routes `/admin/*`.
|
|
|
|
|
|
|
|
```go
|
|
|
|
echo.Group("/admin")
|
|
|
|
e.Use(mw.BasicAuth(func(usr, pwd string) bool {
|
|
|
|
if usr == "joe" && pwd == "secret" {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}))
|
|
|
|
```
|
|
|
|
|
|
|
|
### URI building
|
|
|
|
|
|
|
|
`Echo.URI` can be used to generate URI for any handler with specified path parameters.
|
|
|
|
It's helpful to centralize all your URI patterns which ease in refactoring your
|
|
|
|
application.
|
|
|
|
|
|
|
|
`e.URI(h, 1)` will generate `/users/1` for the route registered below
|
|
|
|
|
|
|
|
```go
|
|
|
|
// Handler
|
|
|
|
h := func(c *echo.Context) error {
|
|
|
|
return c.String(http.StatusOK, "OK")
|
|
|
|
}
|
|
|
|
|
|
|
|
// Route
|
|
|
|
e.Get("/users/:id", h)
|
|
|
|
```
|