共计 6118 个字符,预计需要花费 16 分钟才能阅读完成。
简介
wego 是一个 Go 语言编写的高性能的 Web 框架,能够用来疾速开发 RESTful 服务以及后端服务等各种利用。
wego 框架是一个残缺的 MVC 框架,包含路由模块、数据库 ORM 模块、view 模板解决以及 Session 模块。
wego 具备性能高、不便易用,兼容性好,扩展性强等特点,具体特色如下:
- 基于 Radix 树开发的路由模块,路由查问性能高。
- 反对路由组。
- 为路由参数、Query 参数、Form 参数的拜访提供率不便易于应用的 API,并能够将参数映射到 Struct。
- 为 JSON、XML 和 HTML 渲染提供了易于应用的 API。
- 反对过滤器中间件,不便您对 Web 框架进行扩大。
- 反对 BeforeRoute、BeforeExec、AfterExec 拦截器,不便您进行身份验证、日志输入。
- 内置 Crash 解决机制,wego 能够 recover 一个 HTTP 申请中的 panic,这样可确保您的服务器始终可用。
- 内置 Config 模块,不便对利用的参数进行治理。
- 内置 Session 模块,您能够抉择 cookie、redis、memcache、memory 缓存引擎存储 Session 数据。
- 内置 ORM 模块(开发中)。
- 内置 log 模块,用于生成利用日志。
- 采纳缓存来治理 HTML 的 Template,既不便输入 Html 页面,又能够应用缓存晋升零碎性能。
- 良好的兼容性,wego 反对 go 原生的 func(http.ResponseWriter, *http.Request) 路由处理函数,这样您的代码大量批改就能够应用 wego 了。
- 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