关于golang:Go语言Web框架wego使用说明

简介

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 main
import (
    "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、cache
    session_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 main
import 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

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理