wego Go 语言 Web 框架开源项目

我要开发同款
匿名用户2022年02月24日
52阅读
开发技术GO语言
所属分类Google Go、Web框架、Web应用开发
授权协议Apache

作品详情

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数据。支持混合路由,固定路由、参数路由、通配符路由可以混合,不冲突。内置log模块,用于生成应用日志。采用缓存来管理HTML的Template,既方便输出Html页面,又可以使用缓存提升系统性能。良好的兼容性,wego支持go原生的func(http.ResponseWriter,*http.Request)路由处理函数,这样您的代码少量修改就可以使用wego了。wego兼容两种编码习惯,可以使用普通函数作为路由处理函数,也可以使用strcut的成员函数作为路由处理函数。安装gogetgithub.com/haming123/wego

使用文档请点击:详细文档

简单httpserver创建一个main.go文件,代码如下:

packagemainimport("wego"log"wego/dlog")funcmain(){web,err:=wego.NewWeb()iferr!=nil{log.Error(err)return}web.GET("/hello",func(c*wego.WebContext){c.WriteText(200,"world")})err=web.Run(":8080")iferr!=nil{log.Error(err)}}然后运行它,打开浏览器,输入https://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-入口文件注册参数路由funcmain(){web,err:=wego.NewWeb()iferr!=nil{log.Error(err)return}web.PATH("/user/:id",func(c*wego.WebContext){c.WriteTextF(200,"paramid=%s",c.RouteParam.GetString("id").Value)})err=web.Run(":8080")iferr!=nil{log.Error(err)}}注册模糊匹配路由funcmain(){web,err:=wego.NewWeb()iferr!=nil{log.Error(err)return}web.PATH("/files/*name",func(c*wego.WebContext){c.WriteTextF(200,"paramname=%s",c.RouteParam.GetString("name").Value)})err=web.Run(":8080")iferr!=nil{log.Error(err)}}注册RESTful路由funcmain(){web,err:=wego.NewWeb()iferr!=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")iferr!=nil{log.Error(err)}}获取参数在wego中通过c.Param.GetXXX函数来获取请求参数:

funcmain(){web,err:=wego.NewWeb()iferr!=nil{log.Error(err)return}web.GET("/user",func(c*WebContext){name:=c.Param.GetString("name")ifname.Error!=nil{t.Error(name.Error)}age:=c.Param.GetInt("age")ifage.Error!=nil{t.Error(age.Error)}c.WriteText(200,name.Value)})err=web.Run(":8080")iferr!=nil{log.Error(err)}}使用MustXXX便捷函数获取参数funcmain(){web,err:=wego.NewWeb()iferr!=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")iferr!=nil{log.Error(err)}}使用ReadJSON获取参数若POST请求中Body的数据的格式为JSON格式,可以直接使用WebContext的ReadJSON函数来读取:

funcmain(){web,err:=wego.NewWeb()iferr!=nil{log.Error(err)return}web.POST("/user",func(c*WebContext){varuser2Usererr:=c.ReadJSON(&user2)iferr!=nil{t.Log(err)}t.Log(user2)})err=web.Run(":8080")iferr!=nil{log.Error(err)}}输出JSON数据wego对于JSON的支持非常好,可以让我们非常方便的开发一个基于JSON的API。若要返回JSON请求结果,您可以使用WriteJSON函数:

funcwriteJson(c*wego.WebContext){varuserUseruser.ID=1user.Name="demo"user.Age=12c.WriteJSON(200,user)}输出HTML数据wego框架的html结果的输出是基于html/template实现的。以下是一个输出html页面的例子:

funcwriteHtml(c*wego.WebContext){varuserUseruser.ID=1user.Name="demo"user.Age=12c.WriteHTML(200,"./views/index.html",user)}使用模板函数如果您的模板文件中使用了模板函数,需要预先将所需的模板函数进行登记:

funcGetUserID(idint64)string{returnfmt.Sprintf("ID_%d",id)}funcmain(){web,err:=wego.NewWeb()iferr!=nil{log.Error(err)return}wego.AddTemplFunc("GetUserID",GetUserID)web.GET("/templfunc",(c*wego.WebContext){varuserUseruser.ID=1user.Name="lisi"user.Age=12c.WriteHTML(200,"./views/index.html",user)})err=web.Run(":8080")iferr!=nil{log.Error(err)}}设置cookiefuncsetCookie(c*wego.WebContext){val,err:=c.Input.Cookie("demo")iferr!=nil{log.Error(err)}cookie:=&http.Cookie{Name:"demo",Value:"test",Path:"/",HttpOnly:true,}c.SetCookie(cookie)}重定向funcmain(){web,err:=wego.NewWeb()iferr!=nil{log.Error(err)return}web.GET("/redirect",func(c*wego.WebContext){c.Redirect(302,"/index")})err=web.Run(":8080")iferr!=nil{log.Error(err)}}错误处理funcmain(){web,err:=wego.NewWeb()iferr!=nil{log.Error(err)return}web.GET("/abort",func(c*wego.WebContext){name:=c.Param.GetString("name")ifname.Error!=nil{c.AbortWithError(500,name.Error)return}c.WriteText(200,"hello"+name.Value)})err=web.Run(":8080")iferr!=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服务器funcmain(){web,err:=wego.InitWeb()iferr!=nil{log.Error(err)return}err=web.Run()iferr!=nil{log.Error(err)}}说明:调用InitWeb()函数时可以指定一个配置文件,若没有指定配置文件,则使用缺省的配置文件:./app.conf。

获取业务参数调用InitWeb()后wego会自动将系统参数解析到WebEngine.Config中,业务参数则需要用户自己调用配置数据的GetXXX函数来获取。例如:

funcmain(){web,err:=wego.InitWeb()iferr!=nil{log.Error(err)return}mysql_cnn:=web.Config.GetString("mysql")ifmysql_cnn.Error!=nil{log.Error(mysql_cnn.Error)return}log.Info(mysql_cnn.Value)err=web.Run()iferr!=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然后在入口函数中加载配置文件funcmain(){web,err:=wego.NewWeb()iferr!=nil{log.Error(err)return}web.GET("/login",login)web.GET("/index",index)err=web.Run(":8080")iferr!=nil{log.Error(err)}}然后再login处理器函数中保存session数据:funclogin(c*wego.WebContext){c.Session.Set("uid",1)c.Session.Save()c.Redirect(302,"/index")}然后index处理器函数中就可以访问session数据了:funcindex(c*wego.WebContext){id,_:=c.Session.GetInt("uid")c.WriteTextF(200,"uid=%d",id)}输出日志packagemainimportlog"wego/dlog"funcmain(){log.Debug("ThisisaDebugMessage")log.Info("ThisisaInfoMessage")}//执行后的输出结果为://2021/11/3007:20:06[D]main.go:31ThisisaDebugMessage//2021/11/3007:20:06[I]main.go:32ThisisaDebugInfo

 

 

声明:本文仅代表作者观点,不代表本站立场。如果侵犯到您的合法权益,请联系我们删除侵权资源!如果遇到资源链接失效,请您通过评论或工单的方式通知管理员。未经允许,不得转载,本站所有资源文章禁止商业使用运营!
下载安装【程序员客栈】APP
实时对接需求、及时收发消息、丰富的开放项目需求、随时随地查看项目状态

评论