简介

wego是一个Go语言编写的高性能的Web框架,能够用来疾速开发RESTful服务以及后端服务等各种利用。
wego框架是一个残缺的MVC框架,包含路由模块、数据库ORM模块、view模板解决以及Session模块。
wego具备性能高、不便易用,兼容性好,扩展性强等特点,具体特色如下:

  1. 基于Radix树开发的路由模块,路由查问性能高。
  2. 反对路由组。
  3. 为路由参数、Query参数、Form参数的拜访提供率不便易于应用的API,并能够将参数映射到Struct。
  4. 为JSON、XML和HTML渲染提供了易于应用的API。
  5. 反对过滤器中间件,不便您对Web框架进行扩大。
  6. 反对BeforeRoute、BeforeExec、AfterExec拦截器,不便您进行身份验证、日志输入。
  7. 内置Crash解决机制,wego能够recover一个HTTP申请中的panic,这样可确保您的服务器始终可用。
  8. 内置Config模块,不便对利用的参数进行治理。
  9. 内置Session模块,您能够抉择cookie、redis、memcache、memory缓存引擎存储Session数据。
  10. 内置ORM模块(开发中)。
  11. 内置log模块,用于生成利用日志。
  12. 采纳缓存来治理HTML的Template,既不便输入Html页面,又能够应用缓存晋升零碎性能。
  13. 良好的兼容性,wego反对go原生的func(http.ResponseWriter, *http.Request)路由处理函数,这样您的代码大量批改就能够应用wego了。
  14. wego兼容两种编码习惯,能够应用一般函数作为路由处理函数,也能够应用strcut的成员函数作为路由处理函数。

装置

go get github.com/haming123/wego

应用文档

请点击:具体文档

简略http server

创立一个main.go文件,代码如下:

package mainimport (    "github.com/haming123/wego"    log "github.com/haming123/wego/dlog")func main() {    web, err := wego.NewWeb()    if err != nil{        log.Error(err)        return    }    web.GET("/hello", func(c *wego.WebContext) {        c.WriteText(200, "world")    })    err = web.Run(":8080")    if err != nil {        log.Error(err)    }}

而后运行它,关上浏览器,输出http://localhost:8080/hello, 就能够看到如下内容:

world

我的项目构造

wego框没有对我的项目构造做出限度,这里给出一个MVC框架我的项目的倡议构造:

demo├── app             │   └── router.go       - 路由配置文件│   └── templfun.go     - 模板函数文件├── controllers         - 控制器目录,必要的时候能够持续划分子目录│   └── controller_xxx.go├── models              - 模型目录│   └── model_xxx.go├── logs                - 日志文件目录,次要保留我的项目运行过程中产生的日志│   └── applog_20211203.log├── static              - 动态资源目录│   ├── css│   ├── img│   └── js├── utils               - 公共代码目录│   └── util_xxx.go├── views               - 视图模板目录│   └── html_xxx.html├── app.conf            - 利用配置文件└── main.go             - 入口文件

注册参数路由

func main() {    web, err := wego.NewWeb()    if err != nil{        log.Error(err)        return    }    web.PATH("/user/:id", func(c *wego.WebContext) {        c.WriteTextF(200, "param id=%s", c.RouteParam.GetString("id").Value)    })    err = web.Run(":8080")    if err != nil {        log.Error(err)    }}

注册含糊匹配路由

func main() {    web, err := wego.NewWeb()    if err != nil{        log.Error(err)        return    }    web.PATH("/files/*name", func(c *wego.WebContext) {        c.WriteTextF(200, "param name=%s", c.RouteParam.GetString("name").Value)    })    err = web.Run(":8080")    if err != nil {        log.Error(err)    }}

注册RESTful路由

func main() {    web, err := wego.NewWeb()    if err != nil{        log.Error(err)        return    }    web.GET("/users/:id", func(c *wego.WebContext) {        //查问一个用户    })    web.POST("/users/:id", func(c *wego.WebContext) {        //创立一个用户    })    web.PUT("/users/:id", func(c *wego.WebContext) {        //更新用户信息    })    web.PATCH("/users/:id", func(c *wego.WebContext) {        //更新用户的局部信息    })    web.DELETE("/users/:id", func(c *wego.WebContext) {        //删除用户    })    err = web.Run(":8080")    if err != nil {        log.Error(err)    }}

获取参数

在wego中通过c.Param.GetXXX函数来获取申请参数:

func main() {    web, err := wego.NewWeb()    if err != nil{        log.Error(err)        return    }    web.GET("/user", func(c *WebContext) {        name := c.Param.GetString("name")        if name.Error != nil {            t.Error(name.Error)        }        age := c.Param.GetInt("age")        if age.Error != nil {            t.Error(age.Error)        }        c.WriteText(200, name.Value)    })    err = web.Run(":8080")    if err != nil {        log.Error(err)    }}

应用MustXXX便捷函数获取参数

func main() {    web, err := wego.NewWeb()    if err != nil{        log.Error(err)        return    }    web.GET("/user", func(c *WebContext) {        name := c.Param.MustString("name")        t.Log(name)        age := c.Param.MustInt("age")        t.Log(age)    })    err = web.Run(":8080")    if err != nil {        log.Error(err)    }}

应用ReadJSON获取参数

若POST申请中Body的数据的格局为JSON格局,能够间接应用WebContext的ReadJSON函数来读取:

func main() {   web, err := wego.NewWeb()   if err != nil{       log.Error(err)       return   }   web.POST("/user", func(c *WebContext) {       var user2 User       err := c.ReadJSON(&user2)       if err != nil {           t.Log(err)       }       t.Log(user2)   })   err = web.Run(":8080")   if err != nil {       log.Error(err)   }}

输入JSON数据

wego对于JSON的反对十分好,能够让咱们十分不便的开发一个基于JSON的API。若要返回JSON申请后果,您能够应用WriteJSON函数:

func writeJson(c *wego.WebContext) {    var user User    user.ID = 1    user.Name = "demo"    user.Age = 12    c.WriteJSON(200, user)}

输入HTML数据

wego框架的html后果的输入是基于html/template实现的。以下是一个输入html页面的例子:

func writeHtml(c *wego.WebContext) {    var user User    user.ID = 1    user.Name = "demo"    user.Age = 12    c.WriteHTML(200, "./views/index.html", user)}

应用模板函数

如果您的模板文件中应用了模板函数,须要事后将所需的模板函数进行注销:

func GetUserID(id int64) string {    return fmt.Sprintf("ID_%d", id)}func main() {    web, err := wego.NewWeb()    if err != nil{        log.Error(err)        return    }    wego.AddTemplFunc("GetUserID", GetUserID)    web.GET("/templfunc", (c *wego.WebContext) {        var user User        user.ID = 1        user.Name = "lisi"        user.Age = 12        c.WriteHTML(200, "./views/index.html", user)     })    err = web.Run(":8080")    if err != nil {        log.Error(err)    }}

设置cookie

func setCookie(c *wego.WebContext)  {    val, err := c.Input.Cookie("demo")    if err != nil {        log.Error(err)    }    cookie := &http.Cookie{        Name:     "demo",        Value:    "test",        Path:     "/",        HttpOnly: true,    }    c.SetCookie(cookie)}

重定向

func main() {    web, err := wego.NewWeb()    if err != nil{        log.Error(err)        return    }    web.GET("/redirect", func(c *wego.WebContext) {        c.Redirect(302, "/index")    })    err = web.Run(":8080")    if err != nil {        log.Error(err)    }}

错误处理

func main() {    web, err := wego.NewWeb()    if err != nil{        log.Error(err)        return    }    web.GET("/abort", func(c *wego.WebContext) {        name := c.Param.GetString("name")        if name.Error != nil {            c.AbortWithError(500, name.Error)            return        }        c.WriteText(200, "hello " + name.Value)    })    err = web.Run(":8080")    if err != nil {        log.Error(err)    }}

应用配置文件

  • 首先定义一个简略的配置文件

    #利用名称app_name = demo#mysql数据库的配置参数mysql = root:rootpwd@tcp(127.0.0.1:3306)/demp?charset=utf8[server]#http监听端口http_port = 8080
  • 应用InitWeb()函数初始化Web服务器

    func main() {  web, err := wego.InitWeb()  if err != nil{      log.Error(err)      return  }  err = web.Run()  if err != nil {      log.Error(err)  }}

    阐明:调用InitWeb()函数时能够指定一个配置文件,若没有指定配置文件,则应用缺省的配置文件:./app.conf。

获取业务参数

调用InitWeb()后wego会主动将零碎参数解析到WebEngine.Config中,业务参数则须要用户本人调用配置数据的GetXXX函数来获取。例如:

func main() {    web, err := wego.InitWeb()    if err != nil{        log.Error(err)        return    }    mysql_cnn := web.Config.GetString("mysql")    if mysql_cnn.Error != nil {        log.Error(mysql_cnn.Error)        return    }    log.Info(mysql_cnn.Value)    err = web.Run()    if err != nil {        log.Error(err)    }}

应用Session

  • 首选定义配置文件:

    #利用名称app_name = demo[server]#http监听端口http_port = 8080[session]#session 是否开启session_on = true#session类型:cookie、cachesession_store=cookie#客户端的cookie的名称cookie_name = "wego"#session 过期工夫, 单位秒life_time = 3600#session数据的hash字符串hash_key = demohash
  • 而后在入口函数中加载配置文件

    func main() {  web, err := wego.NewWeb()  if err != nil{      log.Error(err)      return  }  web.GET("/login", login)  web.GET("/index", index)  err = web.Run(":8080")  if err != nil {      log.Error(err)  }}
  • 而后再login处理器函数中保留session数据:

    func login(c *wego.WebContext)  {  c.Session.Set("uid", 1)  c.Session.Save()  c.Redirect(302, "/index")}
  • 而后index处理器函数中就能够拜访session数据了:

    func index(c *wego.WebContext)  {  id , _ := c.Session.GetInt("uid")  c.WriteTextF(200, "uid=%d", id)}

输入日志

package mainimport log "wego/dlog"func main()  {    log.Debug("This is a Debug Message")    log.Info("This is a Info Message")}//执行后的输入后果为://2021/11/30 07:20:06 [D] main.go:31 This is a Debug Message//2021/11/30 07:20:06 [I] main.go:32 This is a Debug Info