简介
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 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