golang web 封装之路由
发布时间:2020-12-16 18:09:50 所属栏目:大数据 来源:网络整理
导读:概述 一般的 web项目,主要两点:路由 和 数据库。围绕这两点之外就是业务逻辑。下面以几个例子简单谈谈 web项目的封装逻辑。 封装方式一、路由写在 main函数中,数据库初始连接放在 init() 函数中。地址 func init() {db.Connect()}func main() {// Configu
概述一般的 web项目,主要两点:路由 和 数据库。围绕这两点之外就是业务逻辑。下面以几个例子简单谈谈 web项目的封装逻辑。 封装方式一、路由写在 main函数中,数据库初始连接放在 init() 函数中。地址 func init() { db.Connect() } func main() { // Configure router := gin.Default() // Set html render options htmlRender := GinHTMLRender.New() htmlRender.Debug = gin.IsDebugging() htmlRender.Layout = "layouts/default" // htmlRender.TemplatesDir = "templates/" // default // htmlRender.Ext = ".html" // default // Tell gin to use our html render router.HTMLRender = htmlRender.Create() router.RedirectTrailingSlash = true router.RedirectFixedPath = true // Middlewares router.Use(middlewares.Connect) router.Use(middlewares.ErrorHandler) // Statics router.Static("/public","./public") // Routes router.GET("/",func(c *gin.Context) { c.Redirect(http.StatusMovedPermanently,"/articles") }) // Articles router.GET("/new",articles.New) router.GET("/articles/:_id",articles.Edit) router.GET("/articles",articles.List) router.POST("/articles",articles.Create) router.POST("/articles/:_id",articles.Update) router.POST("/delete/articles/:_id",articles.Delete) // Start listening port := Port if len(os.Getenv("PORT")) > 0 { port = os.Getenv("PORT") } router.Run(":" + port) } 封装方式二、路由和 db单独封装到一个函数中,以传参的形式将路由传给另一个函数。地址 func SetUpServer() { r := gin.Default() // secret 相当于签名 store,_ := sessions.NewRedisStore(10,"tcp",CONFIG.Redis.Host,CONFIG.Redis.Password,[]byte(CONFIG.Server.Secret)) r.Use(sessions.Sessions("session",store)) r.Use(gin.Recovery()) r.Use(Uniquify()) r.LoadHTMLGlob("templates/*") r.Static("/static","public/") SetUpRoutes(r) r.GET("/incr",func(c *gin.Context) { c.JSON(200,gin.H{"count": c.MustGet("key").(string)}) }) // var port string r.Run(":" + CONFIG.Server.Port) } 封装三、将路由等封装到 Server struct 中。对此 Server 创建一个 new函数,路由等相关内容只包含在方法中。(面向对象)地址 type Server struct { Ws *melody.Melody Routes *gin.Engine Games []*Game } func New() *Server { ws := melody.New() routes := gin.Default() games := make([]*Game,0) return &Server{ Ws: ws,Routes: routes,Games: games,} } ... ... func (srv *Server) RoutesInit() { srv.Routes.GET("/jq.js",func(c *gin.Context) { http.ServeFile(c.Writer,c.Request,"html/jq.js") }) srv.Routes.GET("/goyaniv.js","html/goyaniv.js") }) srv.Routes.GET("/game/:name",func(c *gin.Context) { cookiekey,_ := c.Request.Cookie("goyanivkey") cookieid,_ := c.Request.Cookie("goyanivid") if cookieid == nil || cookiekey == nil { cookieid := CreateCookie("goyanivkey",GenerateUnique()) cookiekey := CreateCookie("goyanivid",GenerateUnique()) http.SetCookie(c.Writer,cookieid) http.SetCookie(c.Writer,cookiekey) } http.ServeFile(c.Writer,"html/game.html") }) srv.Routes.GET("/gamedev/:name","html/gamedev.html") }) srv.Routes.GET("/game/:name/ws",func(c *gin.Context) { srv.Ws.HandleRequest(c.Writer,c.Request) }) srv.Routes.GET("/gamedev/:name/ws",c.Request) }) srv.Ws.HandleMessage(func(s *melody.Session,msg []byte) { FireMessage(srv,s,msg) }) srv.Ws.HandleDisconnect(func(s *melody.Session) { FireDisconnect(srv,s) }) srv.Ws.HandleConnect(func(s *melody.Session) { FireConnect(srv,s) }) } func (s *Server) Run() { s.RoutesInit() s.Routes.Run(":5000") } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- pyhive 连接 Hive 时错误
- Golang FlameGraph(火焰图)
- Beginning Groovy and Grails: From Novice to Professiona
- 用VB6.0做的自动更新程序
- 谈 Fuzz 技术挖掘 Android 漏洞
- 为什么perl仅在使用范围运算符时取消引用最后一个索引?
- [VB.NET]正则表达式可以先在VB.net 的FORM中吗?怎么写?
- Delphi XE Refactor重构功能简单说明
- delphi – WinAPI – > CryptoAPI – > RSA,私有加密,公共
- 阅读go项目源码,解决无法快速找到interface有哪些struct实