# [Echo v3] (https://echo.labstack.com) [![GoDoc](http://img.shields.io/badge/go-documentation-blue.svg?style=flat-square)](http://godoc.org/github.com/labstack/echo) [![License](http://img.shields.io/badge/license-mit-blue.svg?style=flat-square)](https://raw.githubusercontent.com/labstack/echo/master/LICENSE) [![Build Status](http://img.shields.io/travis/labstack/echo.svg?style=flat-square)](https://travis-ci.org/labstack/echo) [![Coverage Status](http://img.shields.io/coveralls/labstack/echo.svg?style=flat-square)](https://coveralls.io/r/labstack/echo) [![Join the chat at https://gitter.im/labstack/echo](https://img.shields.io/badge/gitter-join%20chat-brightgreen.svg?style=flat-square)](https://gitter.im/labstack/echo) [![Twitter](https://img.shields.io/badge/twitter-@labstack-55acee.svg?style=flat-square)](https://twitter.com/labstack) ### Fast and unfancy HTTP server framework for Go (Golang). ## 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 - Automatic TLS via Let’s Encrypt - Built-in graceful shutdown ## Performance ![Performance](https://i.imgur.com/F2V7TfO.png) ## Quick Start ### Installation ```sh $ go get -u github.com/labstack/echo ``` ### Hello, World! Create `server.go` ```go package main import ( "net/http" "github.com/labstack/echo" ) func main() { e := echo.New() e.GET("/", func(c echo.Context) error { return c.String(http.StatusOK, "Hello, World!") }) if err := e.Start(":1323"); err != nil { e.Logger.Fatal(err.Error()) } } ``` Start server ```sh $ go run server.go ``` Browse to [http://localhost:1323](http://localhost:1323) and you should see Hello, World! on the page. ### Routing ```go e.POST("/users", saveUser) e.GET("/users/:id", getUser) e.PUT("/users/:id", updateUser) e.DELETE("/users/:id", deleteUser) ``` ### Path Parameters ```go // 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` ```go //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 ```go // 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: ```sh $ 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 ```go 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, "Thank you! " + name + "") } ``` Run the following command. ```sh $ curl -F "name=Joe Smith" -F "avatar=@/path/to/your/avatar.png" http://localhost:1323/save // => Thank you! Joe Smith ``` For checking uploaded image, run the following command. ```sh cd 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. ```go 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/*`. ```go e.Static("/static", "static") ``` ##### [Learn More](https://echo.labstack.com/guide/static-files) ### [Template Rendering](https://echo.labstack.com/guide/templates) ### Middleware ```go // 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](https://echo.labstack.com/middleware/body-limit) | Limit request body [Logger](https://echo.labstack.com/middleware/logger) | Log HTTP requests [Recover](https://echo.labstack.com/middleware/recover) | Recover from panics [Gzip](https://echo.labstack.com/middleware/gzip) | Send gzip HTTP response [BasicAuth](https://echo.labstack.com/middleware/basic-auth) | HTTP basic authentication [JWTAuth](https://echo.labstack.com/middleware/jwt) | JWT authentication [Secure](https://echo.labstack.com/middleware/secure) | Protection against attacks [CORS](https://echo.labstack.com/middleware/cors) | Cross-Origin Resource Sharing [CSRF](https://echo.labstack.com/middleware/csrf) | Cross-Site Request Forgery [HTTPSRedirect](https://echo.labstack.com/middleware/redirect#httpsredirect-middleware) | Redirect HTTP requests to HTTPS [HTTPSWWWRedirect](https://echo.labstack.com/middleware/redirect#httpswwwredirect-middleware) | Redirect HTTP requests to WWW HTTPS [WWWRedirect](https://echo.labstack.com/middleware/redirect#wwwredirect-middleware) | Redirect non WWW requests to WWW [NonWWWRedirect](https://echo.labstack.com/middleware/redirect#nonwwwredirect-middleware) | Redirect WWW requests to non WWW [AddTrailingSlash](https://echo.labstack.com/middleware/trailing-slash#addtrailingslash-middleware) | Add trailing slash to the request URI [RemoveTrailingSlash](https://echo.labstack.com/middleware/trailing-slash#removetrailingslash-middleware) | Remove trailing slash from the request URI [MethodOverride](https://echo.labstack.com/middleware/method-override) | Override request method ##### [Learn More](https://echo.labstack.com/middleware/overview) #### Third-party Middleware Middleware | Description :--- | :--- [echoperm](https://github.com/xyproto/echoperm) | Keeping track of users, login states and permissions. [echopprof](https://github.com/mtojek/echopprof) | Adapt net/http/pprof to labstack/echo. ### Next - Head over to [guide](https://echo.labstack.com/guide/installation) - Browse [recipes](https://echo.labstack.com/recipes/hello-world) ### Need help? - [Hop on to chat](https://gitter.im/labstack/echo) - [Open an issue](https://github.com/labstack/echo/issues/new) ## Support Us - :star: the project - [Donate](https://echo.labstack.com/support-echo) - :earth_americas: spread the word - [Contribute](#contribute) to the project ## Contribute **Use issues for everything** - Report issues - Discuss on chat before sending a pull request - Suggest new features or enhancements - Improve/fix documentation ## Credits - [Vishal Rana](https://github.com/vishr) - Author - [Nitin Rana](https://github.com/nr17) - Consultant - [Contributors](https://github.com/labstack/echo/graphs/contributors) ## License [MIT](https://github.com/labstack/echo/blob/master/LICENSE)