乐趣区

关于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
退出移动版