Quick Start


To install Echo Go v1.13 or higher is required. Go v1.12 has limited support and some middlewares will not be available. Make sure your project folder is outside your $GOPATH.

$ mkdir myapp && cd myapp
$ go mod init myapp
$ go get

If you are working with Go v1.14 or earlier use:

$ GO111MODULE=on go get

Hello, World!

Create server.go

package main

import (

func main() {
	e := echo.New()
	e.GET("/", func(c echo.Context) error {
		return c.String(http.StatusOK, "Hello, World!")

Start server

$ go run server.go

Browse to http://localhost:1323 and you should see Hello, World! on the page.


e.POST("/users", saveUser)
e.GET("/users/:id", getUser)
e.PUT("/users/:id", updateUser)
e.DELETE("/users/:id", deleteUser)

Path Parameters

// e.GET("/users/:id", getUser)
func getUser(c echo.Context) error {
  	// User ID from path `users/:id`
  	id := c.Param("id")
	return c.String(http.StatusOK, id)

Browse to http://localhost:1323/users/Joe and you should see ‘Joe’ on the page.

Query Parameters


//e.GET("/show", show)
func show(c echo.Context) error {
	// Get team and member from the query string
	team := c.QueryParam("team")
	member := c.QueryParam("member")
	return c.String(http.StatusOK, "team:" + team + ", member:" + member)

Browse to http://localhost:1323/show?team=x-men&member=wolverine and you should see ‘team:x-men, member:wolverine’ on the page.

Form application/x-www-form-urlencoded

POST /save

name value
name Joe Smith
email [email protected]
// e.POST("/save", save)
func save(c echo.Context) error {
	// Get name and email
	name := c.FormValue("name")
	email := c.FormValue("email")
	return c.String(http.StatusOK, "name:" + name + ", email:" + email)

Run the following command:

$ curl -F "name=Joe Smith" -F "[email protected]" http://localhost:1323/save
// => name:Joe Smith, email:[email protected]

Form multipart/form-data

POST /save

name value
name Joe Smith
avatar avatar
func save(c echo.Context) error {
	// Get name
	name := c.FormValue("name")
	// Get avatar
  	avatar, err := c.FormFile("avatar")
  	if err != nil {
 		return err
 	// Source
 	src, err := avatar.Open()
 	if err != nil {
 		return err
 	defer src.Close()
 	// Destination
 	dst, err := os.Create(avatar.Filename)
 	if err != nil {
 		return err
 	defer dst.Close()
 	// Copy
 	if _, err = io.Copy(dst, src); err != nil {
  		return err

	return c.HTML(http.StatusOK, "<b>Thank you! " + name + "</b>")

Run the following command.

$ curl -F "name=Joe Smith" -F "[email protected]/path/to/your/avatar.png" http://localhost:1323/save
// => <b>Thank you! Joe Smith</b>

For checking uploaded image, run the following command.

cd <project directory>
ls avatar.png
// => avatar.png

Handling Request

  • Bind json, xml, form or query payload into Go struct based on Content-Type request header.
  • Render response as json or xml with status code.
type User struct {
	Name  string `json:"name" xml:"name" form:"name" query:"name"`
	Email string `json:"email" xml:"email" form:"email" query:"email"`

e.POST("/users", func(c echo.Context) error {
	u := new(User)
	if err := c.Bind(u); err != nil {
		return err
	return c.JSON(http.StatusCreated, u)
	// or
	// return c.XML(http.StatusCreated, u)

Static Content

Serve any file from static directory for path /static/*.

e.Static("/static", "static")

Learn More

Template Rendering


// Root level middleware

// Group level middleware
g := e.Group("/admin")
g.Use(middleware.BasicAuth(func(username, password string, c echo.Context) (bool, error) {
  if username == "joe" && password == "secret" {
    return true, nil
  return false, nil

// Route level middleware
track := func(next echo.HandlerFunc) echo.HandlerFunc {
	return func(c echo.Context) error {
		println("request to /users")
		return next(c)
e.GET("/users", func(c echo.Context) error {
	return c.String(http.StatusOK, "/users")
}, track)

Learn More