zen

zen is a elegant and lightweight web framework for Go

Github stars Tracking Chart

zen is a lightweight go framework for web development CircleCI

Coverage Status
Go Report Card
golang
GoDoc
license

zen is a web framework written by go, you will love it if you preffer high performance and lightweight!!!

Features

  • High performance HTTP router
  • Restful API
  • Parameters in path
  • Group APIs
  • Structure log support
  • Form validate and struct bind
  • JSON and XML data bind
  • Built in panic handler
  • Middleware at root or group level
  • Handy response functions
  • Context support
  • Graceful shutdown

Installation

go get github.com/philchia/zen

Examples

Start a server

func main() {
    server := zen.New()

    if err := server.Run(":8080"); err != nil {
        log.Println(err)
    }
}

Using GET, POST, PUT, PATCH, DELETE

    server := zen.New()
    server.Get("/test",handler)
    server.Post("/test", handler)
    server.Put("/test",handler)
    server.Patch("/test", handler)
    server.Delete("/test",handler)

Group route

    server := zen.New()

    user := server.Group("/user")
    {
        user.Get("/test",handler)
        user.Post("/test", handler)
        user.Put("/test",handler)
        user.Patch("/test", handler)
        user.Delete("/test",handler)
    }

Add a middleware

    server := zen.New()
    server.AddInterceptor(func(h HandlerFunc) HandlerFunc {
        return func(ctx zen.Context) {
            ctx.SetField("REQID",1)
            ctx.LogInfo("Root Middleware")
            h(ctx)
        }
    })

Group layer middleware

    server := zen.New()

    user := server.Group("/user")
    {
        user.AddInterceptor(func(h HandlerFunc) HandlerFunc {
        return func(ctx zen.Context) {
            ctx.LogInfo("Group Middleware")
            h(ctx)
        }
    })
    }

Parameters in path

    server := zen.New()
    server.Get("/user/:uid",func (ctx zen.Context) {
        ctx.JSON(map[string]string{"uid": ctx.Param("uid")})
    })
    if err := server.Run(":8080"); err != nil {
    log.Println(err)
    }

Parse and validate input

func handler(ctx zen.Context) {
    var input struct {
        Name string `form:"name" json:"name"`
        Age  int    `form:"age" json:"age"`
        Mail string `form:"mail" valid:"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}" msg:"Illegal email" json:"mail"`
    }

    if err := ctx.ParseValidForm(&input); err != nil {
        ctx.JSON(map[string]string{"err": err.Error()})
        return
    }
    log.Println(input)
    ctx.JSON(input)
}

Handle 404

    server := zen.New()
    server.HandleNotFound(func(ctx zen.Context) {
        ctx.WriteStatus(StatusNotFound)
        ctx.WriteString(StatusText(StatusNotFound))
    })
    if err := server.Run(":8080"); err != nil {
    log.Println(err)
    }

Context support

    server := zen.New()
    server.HandleNotFound(func(ctx zen.Context) {
        ctx, cancel := ctx.WithDeadline(time.Now().Add(time.Second) * 3)
        defer cancel()
        db, _ := sql.Open("mysql", "dsn")
        db.QueryContext(ctx, "SELECT * FROM table;")
    })
    if err := server.Run(":8080"); err != nil {
    log.Println(err)
    }

Standard http.HandleFunc support

    server := zen.New()
    server.Get("/user/:uid",zen.WrapF(func(rw http.ResponseWriter, req *http.Request) {

    }))
    if err := server.Run(":8080"); err != nil {
    log.Println(err)
    }

Graceful shutdown

    server := zen.New()
    server.ShutdownDuration = time.Second * 10
    server.Shutdown()

Force close

    server := zen.New()
    server.Close()

License

zen is published under MIT license

Main metrics

Overview
Name With Ownerphilchia/zen
Primary LanguageGo
Program languageGo, Shell (Language Count: 2)
Platform
License:MIT License
所有者活动
Created At2017-02-21 06:54:03
Pushed At2018-01-13 08:03:37
Last Commit At2018-01-13 16:03:28
Release Count4
Last Release Name2.0.1 (Posted on 2017-09-29 22:27:57)
First Release Name1.1 (Posted on 2017-07-15 17:10:04)
用户参与
Stargazers Count258
Watchers Count5
Fork Count18
Commits Count181
Has Issues Enabled
Issues Count1
Issue Open Count0
Pull Requests Count3
Pull Requests Open Count0
Pull Requests Close Count0
项目设置
Has Wiki Enabled
Is Archived
Is Fork
Is Locked
Is Mirror
Is Private