{"id":13514982,"url":"https://github.com/plimble/ace","last_synced_at":"2025-03-31T04:36:08.483Z","repository":{"id":24275160,"uuid":"27669616","full_name":"plimble/ace","owner":"plimble","description":"Blazing fast Go Web Framework","archived":false,"fork":false,"pushed_at":"2018-06-23T11:35:05.000Z","size":67,"stargazers_count":244,"open_issues_count":3,"forks_count":28,"subscribers_count":14,"default_branch":"master","last_synced_at":"2024-11-01T18:38:10.002Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/plimble.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2014-12-07T12:34:47.000Z","updated_at":"2024-05-13T19:03:49.000Z","dependencies_parsed_at":"2022-07-10T10:46:15.609Z","dependency_job_id":null,"html_url":"https://github.com/plimble/ace","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/plimble%2Face","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/plimble%2Face/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/plimble%2Face/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/plimble%2Face/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/plimble","download_url":"https://codeload.github.com/plimble/ace/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246418658,"owners_count":20773934,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-08-01T05:01:04.904Z","updated_at":"2025-03-31T04:36:08.194Z","avatar_url":"https://github.com/plimble.png","language":"Go","readme":"ACE [![godoc badge](http://godoc.org/github.com/plimble/ace?status.svg)](http://godoc.org/github.com/plimble/ace)   [![gocover badge](http://gocover.io/_badge/github.com/plimble/ace?t=3)](http://gocover.io/github.com/plimble/ace) [![Build Status](https://api.travis-ci.org/plimble/ace.svg?branch=master\u0026t=3)](https://travis-ci.org/plimble/ace) [![Go Report Card](http://goreportcard.com/badge/plimble/ace?t=3)](http:/goreportcard.com/report/plimble/ace)\n========\n\nBlazing fast Go Web Framework\n\n![image](http://image.free.in.th/v/2013/id/150218064526.jpg)\n\n#### Installation\n\n```\ngo get github.com/plimble/ace\n```\n\n#### Import\n\n```go\nimport \"github.com/plimble/ace\"\n```\n\n## Performance\nAce is very fast you can see on [this](https://gist.github.com/witooh/1c05c71d9510b2020e48)\n\n## Usage\n\n#### Quick Start\n\n```go\na := ace.New()\na.GET(\"/:name\", func(c *ace.C) {\n\tname := c.Param(\"name\")\n\tc.JSON(200, map[string]string{\"hello\": name})\n})\na.Run(\":8080\")\n```\n\nDefault Middleware (Logger, Recovery)\n\n```go\na := ace.Default()\na.GET(\"/\", func(c *ace.C) {\n\tc.String(200,\"Hello ACE\")\n})\na.Run(\":8080\")\n```\n\n### Router\n\n```go\na.DELETE(\"/\", HandlerFunc)\na.HEAD(\"/\", HandlerFunc)\na.OPTIONS(\"/\", HandlerFunc)\na.PATCH(\"/\", HandlerFunc)\na.PUT(\"/\", HandlerFunc)\na.POST(\"/\", HandlerFunc)\na.GET(\"/\", HandlerFunc)\n```\n\n##### Example\n\n```go\na := ace.New()\n\na.GET(\"/\", func(c *ace.C){\n\tc.String(200, \"Hello world\")\n})\n\na.POST(\"/form/:id/:name\", func(c *ace.C){\n\tid := c.Param(\"id\")\n\tname := c.Param(\"name\")\n\tage := c.Request.PostFormValue(\"age\")\n})\n```\n\n## Response\n\n##### JSON\n\n```go\ndata := struct{\n\tName string `json:\"name\"`\n}{\n\tName: \"John Doe\",\n}\nc.JSON(200, data)\n```\n\n##### String\n\n```go\nc.String(200, \"Hello Ace\")\n```\n\n##### Download\n\n```go\n//application/octet-stream\nc.Download(200, []byte(\"Hello Ace\"))\n```\n\n##### HTML\n\n```go\nc.HTML(\"index.html\")\n```\n\n##### Redirect\n\n```go\nc.Redirect(\"/home\")\n```\n\n## Group Router\n\n```go\ng := a.Group(\"/people\", func(c *ace.C) {\n\tfmt.Println(\"before route func\")\n\tc.Next()\n})\n\n// /people/:name\ng.GET(\"/:name\", func(c *ace.C) {\n\tc.JSON(200, map[string]string{\"TEST\": \"GET METHOD\"})\n})\n\n// /people/:name\ng.POST(\"/:name\", func(c *ace.C) {\n\tc.JSON(200, map[string]string{\"TEST\": \"POST METHOD\"})\n})\n```\n\n## Data\n\nSet/Get data in any HandlerFunc\n\n```go\na.Use(func(c *ace.C){\n\tc.SetData(\"isLogin\", true)\n})\n\na.Get(\"/\", func(c *ace.C){\n\tisLogin := c.GetData(\"isLogin\").(bool)\n\t//or get all data\n\t//c.GetAllData()\n})\n```\n\n## Get Post Form and Query\n\n```go\na.Get(\"/\", func(c *ace.C){\n\tname := c.MustPostString(key, default_value)\n\tage := c.MustPostInt(key, d)\n\n\tq := c.MustQueryString(key, default_value)\n\tscore := c.MustQueryFloat64(key, default_value)\n})\n```\n\n## Get data From JSON Request\n\n```go\na.Get(\"/\", func(c *ace.C){\n\tuser := struct{\n\t\tName string `json:\"name\"`\n\t}{}\n\n\tc.ParseJSON(\u0026user)\n})\n```\n\n## Panic Response\n\nUse panic instead of `if err != nil` for response error\n\n```go\na.Get(\"/save\", func(c *ace.C){\n\tuser := \u0026User{}\n\n\tc.ParseJSON(user)\n\n\t//this func return error\n\t//if error go to panic handler\n\tc.Panic(doSomething1(user))\n\tc.Panic(doSomething2(user))\n\n\tc.String(201, \"created\")\n}\n\na.Get(\"/get\", func(c *ace.C){\n\tid := c.Param(\"id\")\n\n\tuser, err := doSomeThing()\n\t//if error go to panic handler\n\tc.Panic(err)\n\n\tc.JSON(200, user)\n}\n```\n\n#### Custom panic response\n\n```go\na := ace.New()\na.Panic(func(c *ace.C, rcv interface{}){\n\tswitch err := rcv.(type) {\n\t\tcase error:\n\t\t\tc.String(500, \"%s\\n%s\", err, ace.Stack())\n\t\tcase CustomError:\n\t\t\tlog.Printf(\"%s\\n%s\", err, ace.Stack())\n\t\t\tc.JSON(err.Code, err.Msg)\n\t}\n})\n```\n\n\n## Middlewares\n\nAce middleware is implemented by custom handler\n\n```go\ntype HandlerFunc func(c *C)\n```\n\n##### Example\n\n```go\na := ace.New()\na.Use(ace.Logger())\n```\n\n### Built-in Middlewares\n\n##### Serve Static\n\n```go\na.Static(\"/assets\", \"./img\")\n```\n\n##### Session\n\nYou can use store from [sessions](https://github.com/plimble/sessions)\n\n```go\nimport github.com/plimble/sessions/store/cookie\n\na := ace.New()\n\nstore := cookie.NewCookieStore()\na.Use(ace.Session(store, nil))\n\na.GET(\"/\", func(c *ace.C) {\n\t//get session name\n\tsession1 := c.Sessions(\"test\")\n\tsession1.Set(\"test1\", \"123\")\n\tsession1.Set(\"test2\", 123)\n\n\tsession2 := c.Sessions(\"foo\")\n\tsession2.Set(\"baz1\", \"123\")\n\tsession2.Set(\"baz2\", 123)\n\n\tc.String(200, \"\")\n})\n\na.GET(\"/test\", func(c *C) {\n\tsession := c.Sessions(\"test\")\n\t//get value from key test1 if not found default value \"\"\n\ttest1 := session.GetString(\"test1\", \"\")\n\ttest2 := session.GetInt(\"test2\", 0)\n\n\tc.String(200, \"\")\n})\n```\n\n##### Logger\n\n```go\na.Use(ace.Logger())\n```\n\n## HTML Template Engine\n\nAce built on renderer interface. So you can use any template engine\n\n```go\ntype Renderer interface {\n\tRender(w http.ResponseWriter, name string, data interface{})\n}\n```\n\n### ACE Middlewares\n\n| Name                                                \t| Description                                 \t|\n|-----------------------------------------------------\t|---------------------------------------------\t|\n| [gzip](https://github.com/plimble/ace-contrib/tree/master/gzip)         \t| GZIP compress                               \t|\n| [cors](https://github.com/plimble/ace-contrib/tree/master/cors)         \t| Enable Cross-origin resource sharing (CORS) \t|\n| [sessions](https://github.com/plimble/sessions) \t\t\t\t\t\t\t\t\t\t\t\t\t| Sessions      \t\t\t\t                      \t|\n| [pongo2](https://github.com/plimble/ace-contrib/tree/master/pongo2)     \t| Pongo2 Template Engine                      \t|\n| [csrf](https://github.com/plimble/ace-contrib/tree/master/csrf)         \t| Cross Site Request Forgery protection       \t|\n\n### Contributing\n\nIf you'd like to help out with the project. You can put up a Pull Request.\n","funding_links":[],"categories":["Go"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fplimble%2Face","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fplimble%2Face","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fplimble%2Face/lists"}