项目作者: 8bitdogs

项目描述 :
golang http handler
高级语言: Go
项目地址: git://github.com/8bitdogs/ruffe.git
创建时间: 2019-10-09T18:31:37Z
项目社区:https://github.com/8bitdogs/ruffe

开源协议:MIT License

下载


Ruffe

Go Report
GoDoc
go.dev reference
License
Tag

Ruffe preview

Golang HTTP handler

Guide

Installing

  1. go get -u github.com/8bitdogs/ruffe

Router

  1. package main
  2. import (
  3. "net/http"
  4. "github.com/8bitdogs/ruffe"
  5. )
  6. func main() {
  7. // Ruffe instance
  8. rr := ruffe.New()
  9. // add handler
  10. rr.HandleFunc("/", http.MethodGet, hello)
  11. // Start server
  12. http.ListenAndServe(":3030", rs)
  13. }
  14. // hello handler
  15. func hello(ctx ruffe.Context) error {
  16. return ctx.Result(http.StatusOK, "hello world")
  17. }

Customization

Using custom request router

  1. package main
  2. import (
  3. "net/http"
  4. "github.com/8bitdogs/ruffe"
  5. "github.com/gorilla/mux"
  6. )
  7. type Router struct {
  8. *mux.Router
  9. }
  10. // We have to override gorilla Handle and HandleFunc, because those two functions are returning gorilla Router instance
  11. func (r *Router) Handle(pattern string, handler http.Handler) {
  12. r.Router.Handle(pattern, handler)
  13. }
  14. func (r *Router) HandleFunc(pattern string, handler func(http.ResponseWriter, *http.Request)) {
  15. r.Router.HandleFunc(pattern, handler)
  16. }
  17. type muxCreator struct{}
  18. func (muxCreator) Create() ruffe.Mux {
  19. return &Router{
  20. Router: mux.NewRouter(),
  21. }
  22. }
  23. func main() {
  24. r := ruffe.NewMux(muxCreator{})
  25. r.HandleFunc("/foo/{id}", "GET", func(ctx ruffe.Context) error {
  26. // as you can see, gorilla mux features are available :)
  27. return ctx.Result(http.StatusOK, "bar"+mux.Vars(ctx.Request())["id"])
  28. })
  29. http.ListenAndServe(":3030", r)
  30. }

Interceptors

example with logging interceptor

  1. rr := ruffe.New()
  2. // adding interceptor
  3. rr.AppendInterceptor(func(w http.ResponseWriter, r *http.Request, next http.HandlerFunc) {
  4. log.Println(r.URL, r.Method, r.Header)
  5. next(w, r)
  6. log.Println("done")
  7. })
  8. // ... handlers registration
  9. http.ListenAndServe(":3030", rr)

Middlewares

Handler middleware

  1. // Initializing Ruffe Middleware
  2. // Middleware implements ruffe.Handler interface
  3. mw := ruffe.NewMiddlewareFunc(func(_ ruffe.Context) error {
  4. // Middleware logic
  5. return nil
  6. })
  7. // Add middleware handler before calling <ruffe handler>
  8. mwh := mw.Before(<ruffe handler>) // WrapFunc returns middleware
  9. // Add middleware handler after calling <ruffe handler>
  10. mwh := mw.After(<ruffe handler>) // WrapAfterFunc returns middleware

Router middleware

  1. rr := ruffe.New()
  2. // applies handler which invokes before executing each registered handler
  3. rr.Use(<ruffe handler>)
  4. // applies handler which invokes after executing each registered handler
  5. rr.UseAfter(<ruffe handler>)

Error handling

  1. package main
  2. import (
  3. "errors"
  4. "net/http"
  5. "github.com/8bitdogs/ruffe"
  6. )
  7. var Err = errors.New("error")
  8. func main() {
  9. // Ruffe instance
  10. rr := ruffe.New()
  11. // Define error handler
  12. rr.OnError = func(_ ruffe.Context, err error) error {
  13. if err == Err {
  14. // Caught!
  15. return nil
  16. }
  17. return nil
  18. }
  19. // add handler
  20. rr.HandleFunc("/", http.MethodGet, hello)
  21. // Start server
  22. http.ListenAndServe(":3030", rs)
  23. }
  24. // hello handler
  25. func hello(_ ruffe.Context) error {
  26. return Err
  27. }