- Notifications
You must be signed in to change notification settings - Fork15
⚡ Rux is an simple and fast web framework. support route group, param route binding, middleware, compatible http.Handler interface. 简单且快速的 Go api/web 框架,支持路由分组,路由参数绑定,中间件,兼容 http.Handler 接口
License
gookit/rux
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
Simple and fast web framework for build golang HTTP applications.
- Fast route match, support route group
- Support route path params and named routing
- Support cache recently accessed dynamic routes
- Support route middleware, group middleware, global middleware
- Support quickly add a
RESETFul
orController
style structs - Support generic
http.Handler
interface middleware - Support static file access handle
- Support add handlers for handle
NotFound
andNotAllowed
中文说明请看README.zh-CN
go get github.com/gookit/rux
package mainimport ("github.com/gookit/rux")funcmain() {r:=rux.New()// Add Routes:r.GET("/",func(c*rux.Context) {c.Text(200,"hello")})r.GET("/hello/{name}",func(c*rux.Context) {c.Text(200,"hello "+c.Param("name"))})r.POST("/post",func(c*rux.Context) {c.Text(200,"hello")})// add multi method support for an route pathr.Add("/post[/{id}]",func(c*rux.Context) {ifc.Param("id")=="" {// do create postc.Text(200,"created")return}id:=c.Params.Int("id")// do update postc.Text(200,"updated "+fmt.Sprint(id))},rux.POST,rux.PUT)// Start serverr.Listen(":8080")// can also// http.ListenAndServe(":8080", r)}
r.Group("/articles",func() {r.GET("",func(c*rux.Context) {c.Text(200,"view list") })r.POST("",func(c*rux.Context) {c.Text(200,"create ok") })r.GET(`/{id:\d+}`,func(c*rux.Context) {c.Text(200,"view detail, id: "+c.Param("id")) })})
You can add the path params like:{id}
Or{id:\d+}
// can access by: "/blog/123"r.GET(`/blog/{id:\d+}`,func(c*rux.Context) {c.Text(200,"view detail, id: "+c.Param("id"))})
optional params, like/about[.html]
or/posts[/{id}]
:
// can access by: "/blog/my-article" "/blog/my-article.html"r.GET(`/blog/{title:\w+}[.html]`,func(c*rux.Context) {c.Text(200,"view detail, id: "+c.Param("id"))})r.Add("/posts[/{id}]",func(c*rux.Context) {ifc.Param("id")=="" {// do create postc.Text(200,"created")return }id:=c.Params.Int("id")// do update postc.Text(200,"updated "+fmt.Sprint(id))},rux.POST,rux.PUT)
rux support use middleware, allow:
- global middleware
- group middleware
- route middleware
Call priority:global middleware -> group middleware -> route middleware
Examples:
package mainimport ("fmt""github.com/gookit/rux")funcmain() {r:=rux.New()// add global middlewarer.Use(func(c*rux.Context) {// do something ...})// add middleware for the routeroute:=r.GET("/middle",func(c*rux.Context) {// main handlerc.WriteString("-O-")},func(c*rux.Context) {// middle 1c.WriteString("a")c.Next()// Notice: call Next()c.WriteString("A")// if call Abort(), will abort at the end of this middleware run// c.Abort() })// add more by Use()route.Use(func(c*rux.Context) {// middle 2c.WriteString("b")c.Next()c.WriteString("B")})// now, access the URI /middle// will output: ab-O-BA}
- Call sequence:
middle 1 -> middle 2 -> main handler -> middle 2 -> middle 1
- Flow chart:
+-----------------------------+ | middle 1 | | +----------------------+ | | | middle 2 | | start | | +----------------+ | | end------->| | | main handler | | |--->---- | | |________________| | | | |______________________| | |_____________________________|
more please seemiddleware_test.go middleware tests
rux is support generichttp.Handler
interface middleware
You can use
rux.WrapHTTPHandler()
converthttp.Handler
asrux.HandlerFunc
package mainimport ("net/http""github.com/gookit/rux"// here we use gorilla/handlers, it provides some generic handlers."github.com/gorilla/handlers")funcmain() {r:=rux.New()// create a simple generic http.Handlerh0:=http.HandlerFunc(func (w http.ResponseWriter,r*http.Request) {w.Header().Set("new-key","val")})r.Use(rux.WrapHTTPHandler(h0),rux.WrapHTTPHandler(handlers.ProxyHeaders()))r.GET("/",func(c*rux.Context) {c.Text(200,"hello")})// add routes ...// Wrap our server with our gzip handler to gzip compress all responses.http.ListenAndServe(":8000",handlers.CompressHandler(r))}
package mainimport ("embed""net/http""github.com/gookit/rux")//go:embed staticvarembAssets embed.FSfuncmain() {r:=rux.New()// one filer.StaticFile("/site.js","testdata/site.js")// allow any files in the directory.r.StaticDir("/static","testdata")// file type limit in the directoryr.StaticFiles("/assets","testdata","css|js")// go 1.16+: use embed assets. access: /embed/static/some.htmlr.StaticFS("/embed",http.FS(embAssets))}
Inrux
, you can add a named route, and you can get the corresponding route instance(rux.Route
) from the router according to the name.
Examples:
r:=rux.New()// Method 1myRoute:=rux.NewNamedRoute("name1","/path4/some/{id}",emptyHandler,"GET")r.AddRoute(myRoute)// Method 2rux.AddNamed("name2","/",func(c*rux.Context) {c.Text(200,"hello")})// Method 3r.GET("/hi",func(c*rux.Context) {c.Text(200,"hello")}).NamedTo("name3",r)// get route by namemyRoute=r.GetRoute("name1")
redirect to other page
r.GET("/",func(c*rux.Context) {c.AbortThen().Redirect("/login",302)})// Orr.GET("/",func(c*rux.Context) {c.Redirect("/login",302)c.Abort()})r.GET("/",func(c*rux.Context) {c.Back()c.Abort()})
you can quick operate cookies byFastSetCookie()
DelCookie()
Note: You must set or delete cookies before writing BODY content
r.GET("/setcookie",func(c*rux.Context) {c.FastSetCookie("rux_cookie2","test-value2",3600)c.SetCookie("rux_cookie","test-value1",3600,"/",c.Req.URL.Host,false,true)c.WriteString("hello, in "+c.URL().Path)})r.GET("/delcookie",func(c*rux.Context) {val:=ctx.Cookie("rux_cookie")// "test-value1"c.DelCookie("rux_cookie","rux_cookie2")})
code is refer from
julienschmidt/httprouter
package mainimport ("log""net/http""github.com/gookit/rux")typeHostSwitchmap[string]http.Handler// Implement the ServeHTTP method on our new typefunc (hsHostSwitch)ServeHTTP(w http.ResponseWriter,r*http.Request) {// Check if a http.Handler is registered for the given host.// If yes, use it to handle the request.ifrouter:=hs[r.Host];router!=nil {router.ServeHTTP(w,r)}else {// Handle host names for which no handler is registeredhttp.Error(w,"Forbidden",403)// Or Redirect?}}funcmain() {// Initialize a router as usualrouter:=rux.New()router.GET("/",Index)router.GET("/hello/{name}",func(c*rux.Context) {})// Make a new HostSwitch and insert the router (our http handler)// for example.com and port 12345hs:=make(HostSwitch)hs["example.com:12345"]=router// Use the HostSwitch to listen and serve on port 12345log.Fatal(http.ListenAndServe(":12345",hs))}
package mainimport ("log""net/http""github.com/gookit/rux")typeProductstruct {}// Uses middlewares [optional]func (Product)Uses()map[string][]rux.HandlerFunc {returnmap[string][]rux.HandlerFunc{// function name: handlers"Delete": []rux.HandlerFunc{handlers.HTTPBasicAuth(map[string]string{"test":"123"}),handlers.GenRequestID(),},}}// all products [optional]func (p*Product)Index(c*rux.Context) {// do something}// create product [optional]func (p*Product)Create(c*rux.Context) {// do something}// save new product [optional]func (p*Product)Store(c*rux.Context) {// do something}// show product with {id} [optional]func (p*Product)Show(c*rux.Context) {// do something}// edit product [optional]func (p*Product)Edit(c*rux.Context) {// do something}// save edited product [optional]func (p*Product)Update(c*rux.Context) {// do something}// delete product [optional]func (p*Product)Delete(c*rux.Context) {// do something}funcmain() {router:=rux.New()// methodsPathActionRoute Name// GET/productindexproduct_index// GET/product/createcreateproduct_create// POST/productstoreproduct_store// GET/product/{id}showproduct_show// GET/product/{id}/editeditproduct_edit// PUT/PATCH/product/{id}updateproduct_update// DELETE/product/{id}deleteproduct_delete// resetful stylerouter.Resource("/",new(Product))log.Fatal(http.ListenAndServe(":12345",router))}
package mainimport ("log""net/http""github.com/gookit/rux")// News controllertypeNewsstruct {}func (n*News)AddRoutes(g*rux.Router) {g.GET("/",n.Index)g.POST("/",n.Create)g.PUT("/",n.Edit)}func (n*News)Index(c*rux.Context) {// Do something}func (n*News)Create(c*rux.Context) {// Do something}func (n*News)Edit(c*rux.Context) {// Do something}funcmain() {router:=rux.New()// controller stylerouter.Controller("/news",new(News))log.Fatal(http.ListenAndServe(":12345",router))}
package mainimport ("log""net/http""github.com/gookit/rux")funcmain() {// Initialize a router as usualrouter:=rux.New()router.GET(`/news/{category_id}/{new_id:\d+}/detail`,func(c*rux.Context) {varu=make(url.Values)u.Add("username","admin")u.Add("password","12345")b:=rux.NewBuildRequestURL()// b.Scheme("https")// b.Host("www.mytest.com")b.Queries(u)b.Params(rux.M{"{category_id}":"100","{new_id}":"20"})// b.Path("/dev")// println(b.Build().String())println(c.Router().BuildRequestURL("new_detail",b).String())// result: /news/100/20/detail?username=admin&password=12345// get current route nameifc.MustGet(rux.CTXCurrentRouteName)=="new_detail" {// post data etc.... }}).NamedTo("new_detail",router)// Use the HostSwitch to listen and serve on port 12345log.Fatal(http.ListenAndServe(":12345",router))}
- lint
golint ./...
- format check
# list error filesgofmt -s -l ./# fix format and write to filegofmt -s -w some.go
- unit test
gotest -cover ./...
- gookit/ini Go config management, use INI files
- gookit/rux Simple and fast request router for golang HTTP
- gookit/gcli build CLI application, tool library, running CLI commands
- gookit/slog Concise and extensible go log library
- gookit/event Lightweight event manager and dispatcher implements by Go
- gookit/cache Generic cache use and cache manager for golang. support File, Memory, Redis, Memcached.
- gookit/config Go config management. support JSON, YAML, TOML, INI, HCL, ENV and Flags
- gookit/color A command-line color library with true color support, universal API methods and Windows support
- gookit/filter Provide filtering, sanitizing, and conversion of golang data
- gookit/validate Use for data validation and filtering. support Map, Struct, Form data
- gookit/goutil Some utils for the Go: string, array/slice, map, format, cli, env, filesystem, test and more
- More please seehttps://github.com/gookit
About
⚡ Rux is an simple and fast web framework. support route group, param route binding, middleware, compatible http.Handler interface. 简单且快速的 Go api/web 框架,支持路由分组,路由参数绑定,中间件,兼容 http.Handler 接口
Topics
Resources
License
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Packages0
Uh oh!
There was an error while loading.Please reload this page.
Contributors4
Uh oh!
There was an error while loading.Please reload this page.