jimzhan b8aaa91bd6 consolidate rex options | 9年前 | |
---|---|---|
cmd/rex | 9年前 | |
internal | 9年前 | |
livereload | 9年前 | |
modules | 9年前 | |
LICENSE | 9年前 | |
Makefile | 9年前 | |
README.md | 9年前 | |
logger.go | 9年前 | |
options.go | 9年前 | |
response.go | 9年前 | |
rex.go | 9年前 | |
router.go | 9年前 | |
utils.go | 9年前 |
Rex is a library for modular web development in Go, designed to work directly with net/http.
Install the package, along with executable binary helper (go 1.4 and greater is required):
$ go get -v github.com/goanywhere/rex/...
After installing Go and setting up your GOPATH, create your first server.
package main
import (
"io"
"net/http"
"github.com/goanywhere/rex"
)
func main() {
rex.Get("/", func(w http.ResponseWriter, r *http.Request) {
io.WriteString(w, "Hello World")
})
rex.Run()
}
Then start your server:
rex run
You will now have a HTTP server running on localhost:5000
.
All settings on Rex can be accessed via env
, which essentially stored in os.Environ
. By using this approach you can compile your own settings files into the binary package for deployment without exposing the sensitive settings, it also makes configuration extremly easy & flexible via both command line & application.
package main
import (
"github.com/goanywhere/rex"
"github.com/goanywhere/x/env"
)
func index (ctx *rex.Context) {
ctx.Render("index.html")
}
func main() {
// Override default 5000 port here.
env.Set("PORT", 9394)
rex.Get("/", index)
rex.Run()
}
You will now have the HTTP server running on 0.0.0.0:9394
.
Hey, dude, why not just use those popular approaches, like file-based config? We know you’ll be asking & we have the answer as well, here.
Modules (aka. middleware) work between http requests and the router, they are no different than the standard http.Handler. Existing modules from other frameworks like logging, authorization, session, gzipping are very easy to integrate into Rex. As long as it complies the standard func(http.Handler) http.Handler
signature, you can simply add one like this:
app.Use(modules.XSRF)
Since a module is just the standard http.Handler, writing a custom module is also pretty straightforward:
app.Use(func(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
log.Printf("Custom Middleware Module Started")
next.ServeHTTP(writer, request)
log.Printf("Custom Middleware Module Ended")
})
})
Using prefixed (aka. subrouter) router is exactly same as the main one:
app := rex.new()
app.Get("/", func(w http.ResponseWriter, r *http.Request) {
io.WriteString(w, "index page")
})
user := app.Group("/users")
user.Use(func(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
log.Printf("this is a protected page")
next.ServeHTTP(writer, request)
})
})
Positive! Rex is an internal/fundamental project at GoAnywhere. We developed it and we are going to continue using/improving it.