golang web 封装之路由

前端之家收集整理的这篇文章主要介绍了golang web 封装之路由前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

一般的 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")
}

猜你在找的Go相关文章