1
0
mirror of https://github.com/labstack/echo.git synced 2024-12-20 19:52:47 +02:00
High performance, minimalist Go web framework https://echo.labstack.com/
Go to file
Vishal Rana bc173df6ba updated website
Signed-off-by: Vishal Rana <vr@labstack.com>
2016-11-15 08:26:38 -08:00
_fixture Left over 2016-01-28 23:56:09 -08:00
.github Update ISSUE_TEMPLATE.md 2016-08-29 13:45:46 -07:00
context Closes #626, #625 2016-08-19 14:07:07 -07:00
engine Fixed http2 2016-09-24 16:21:04 -07:00
log Added JSON logging 2016-06-08 17:16:03 -07:00
middleware cors: not checking for origin header 2016-11-12 14:29:11 -08:00
recipe website/recipe in the main repo 2016-10-20 09:11:07 -07:00
test Fix XML double WriteHeader (#677) 2016-10-25 07:56:41 -07:00
website updated website 2016-11-15 08:26:38 -08:00
.editorconfig adding editorconfig for happiness 2015-06-23 22:43:07 -07:00
.gitattributes Moved examples to recipes 2015-10-08 20:10:55 -07:00
.gitignore updated docs 2016-10-20 09:16:47 -07:00
.travis.yml Update .travis.yml 2016-08-17 11:08:40 -04:00
binder_test.go Fixed #574 2016-06-23 19:49:01 -07:00
binder.go Closes #610, Closes #611 2016-08-17 11:07:25 -04:00
context_test.go Fix XML double WriteHeader (#677) 2016-10-25 07:56:41 -07:00
context.go fixed #694 2016-10-27 07:34:28 -07:00
cookie_test.go Test coverage for cookie.go and context.go 2016-06-05 22:25:34 -07:00
cookie.go Added cookie.go 2016-05-06 07:39:41 -07:00
echo_test.go closes #669 (#670) 2016-10-07 19:25:01 -07:00
echo.go router changes 2016-10-21 20:40:36 -07:00
glide.lock updated deps 2016-10-20 09:17:51 -07:00
glide.yaml updated deps 2016-10-20 09:17:51 -07:00
group_test.go Fix issue with middleware from one route leaking into the middleware of other routes 2016-06-16 07:29:25 -07:00
group.go bug fix static files in routing group (#642) 2016-10-25 17:19:33 -07:00
LICENSE Refactored variable names 2016-04-24 10:22:15 -07:00
README.md updated website 2016-11-13 12:37:37 -08:00
router_test.go router changes 2016-10-21 20:40:36 -07:00
router.go router changes 2016-10-21 20:40:36 -07:00

Echo v2 GoDoc License Build Status Coverage Status Join the chat at https://gitter.im/labstack/echo Twitter

Don't forget to try the upcoming v3 tracked here

Fast and unfancy HTTP server framework for Go (Golang). Up to 10x faster than the rest.

Feature Overview

  • Optimized HTTP router which smartly prioritize routes
  • Build robust and scalable RESTful APIs
  • Run with standard HTTP server or FastHTTP server
  • Group APIs
  • Extensible middleware framework
  • Define middleware at root, group or route level
  • Data binding for JSON, XML and form payload
  • Handy functions to send variety of HTTP responses
  • Centralized HTTP error handling
  • Template rendering with any template engine
  • Define your format for the logger
  • Highly customizable

Performance

Performance

Quick Start

Installation

Echo is developed and tested using Go 1.6.x and 1.7.x

$ go get -u github.com/labstack/echo

Ideally, you should rely on a package manager like glide or govendor to use a specific version of Echo.

Hello, World!

Create server.go

package main

import (
	"net/http"
	"github.com/labstack/echo"
	"github.com/labstack/echo/engine/standard"
)

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

Start server

$ go run server.go

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

Routing

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

/show?team=x-men&member=wolverine

//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 joe@labstack.com
// 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=joe@labstack.com" http://localhost:1323/save
// => name:Joe Smith, email:joe@labstack.com

Form multipart/form-data

POST /save

name value
name Joe Smith
avatar avatar
// e.POST("/save", save)
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 "avatar=@/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 or XML or form 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"`
	Email string `json:"email" xml:"email" form:"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

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

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

Template Rendering

Middleware

// Root level middleware
e.Use(middleware.Logger())
e.Use(middleware.Recover())

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

// 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)

Built-in Middleware

Middleware Description
BodyLimit Limit request body
Logger Log HTTP requests
Recover Recover from panics
Gzip Send gzip HTTP response
BasicAuth HTTP basic authentication
JWTAuth JWT authentication
Secure Protection against attacks
CORS Cross-Origin Resource Sharing
CSRF Cross-Site Request Forgery
Static Serve static files
HTTPSRedirect Redirect HTTP requests to HTTPS
HTTPSWWWRedirect Redirect HTTP requests to WWW HTTPS
WWWRedirect Redirect non WWW requests to WWW
NonWWWRedirect Redirect WWW requests to non WWW
AddTrailingSlash Add trailing slash to the request URI
RemoveTrailingSlash Remove trailing slash from the request URI
MethodOverride Override request method
Learn More

Third-party Middleware

Middleware Description
echoperm Keeping track of users, login states and permissions.
echopprof Adapt net/http/pprof to labstack/echo.

Next

Need help?

Support Us

Contribute

Use issues for everything

  • Report issues
  • Discuss on chat before sending a pull request
  • Suggest new features or enhancements
  • Improve/fix documentation

Credits

License

MIT