# go-web-router **Repository Path**: tym_hmm/go-web-router ## Basic Information - **Project Name**: go-web-router - **Description**: golang http 服务路由封装,集成路由中件间,静态模板加载,模板打包到二进制文件 - **Primary Language**: Go - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2022-03-03 - **Last Updated**: 2024-01-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### golang 原生web路由组件 #### 基于golang http web服务封装 直接兼容golang web服务 环镜: golang >=1.6 ### 依赖组件 [hlog(日志组件) gitee.com/tym_hmm/hlog =>](gitee.com/tym_hmm/hlog) ### 获取路由间方式 ``` go get -u gitee.com/tym_hmm/go-web-router ``` ### 功能说明 >1.路由件已将模板及静态文件[js css]打入二进制包
>2.自定义路由中件间
>3.兼容golang原生http创建
### demo > 注意: > 1.需在二进制文件创建资源目录
> 2.在扩口文件最上方引入go 1.6特性(静态资源打入二进制包) > > ``` > import( > "embed" > _ "embed" >) >``` > 3.配置资源目录, 在main入口方法之前 >```//go:embed <资源目录>``` > `main.go` ``` //go:embed Asset var publicAsset embed.FS func main() { addr := fmt.Sprint(":8080") /**初始化路由件 非调试化输出**/ routerEngine := Route.EngineNew(&publicAsset) //调试模式选择输出 EngineNewMode(publicAsset *embed.FS, isDebug bool) //routerEngine := Route.EngineNewMode(&publicAsset, true) /** * 设置模板加载 * "Asset/template" string 本地模板存放目录 * ".html" string 模板后缀 **/ routerEngine.SetTemplate("Asset/template", ".html") /** 自定义json 返回key **/ routerEngine.SetResponseKeyCode("code") routerEngine.SetResponseKeyMessage("msg") routerEngine.SetResponseKeyData("data") /** * 设置静态文件加载路由[css js] **/ registerStaticResource(routerEngine, &publicAsset) /** * 设置图片服务路由[不打入到二进制包] */ registerStoreSource(routerEngine) /** * 注册访问api **/ registerApiRoute(routerEngine) /** * 路由创建 */ routerEngine.CreateRouter() fmt.Printf("http server start in %s", addr) err := http.ListenAndServe(addr, routerEngine) if err != nil { fmt.Println(err) os.Exit(1) } } //注册静态资源打包到程序 [css js] func registerStaticResource(routerEngine *Route.Engine, publicAsset *embed.FS) { if publicAsset != nil { /** * 参数说明 * "/static/"  对外(如:浏览器 访问地址 http://xxxx.com/static/sss.js) * "/asset/source" 源码存放目录(会打入到二进制文件) */ routerEngine.StaticFS("/static/", publicAsset, "/asset/source") } } /*****本地附件注册 [如上传的图片等 不会打入包]*****/ func registerStoreSource(routerEngine *Route.Engine) { /** * 参数说明 * "/upload" 对外访问目录(如[http://xxx.com/upload/a.jpg]) * "/AssetUpload" 本地存在目录 会在二进制文件相同目录下生成文件夹 */ routerEngine.AttachFs("/upload", "/AssetUpload") } /** 路由注册 **/ func registerApiRoute(e *Route.Engine) { v1 := e.Group("/v1") //中间件使用 v1.UseMiddleware( RequestMiddleware()) v1.Get("/test", func(c *Route.Context) { c.JsonResponse(100, "这是测试", nil) }) v1.Get("/view", func(c *Route.Context) { c.Template(nil, "default") }) v1.Get("/viewmultiple", func(c *Route.Context) { data := map[string]string{"siteName": ""} c.TemplateMultiple(data, []string{ "defaultm","header", "foot"}) }) } /** 请求日志拦截[路由中间件] **/ func RequestMiddleware() Route.HttpFunc { return func(c *Route.Context) { var param interface{} if strings.ToLower(c.Request.Method) == "post" { param = c.Request.Form } else { param = c.Request.URL.Query() } body, _ := ioutil.ReadAll(c.Request.Body) c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(body)) fmt.Printf("request\r\nurl:%s\r\naddr: %s\r\nheader: %s\r\ncooke:%s\r\nmethod: %s\r\nparam:%s\r\nbody:%s\n", c.Request.URL, c.Request.RemoteAddr, c.Request.Header, c.Request.Cookies(), c.Request.Method, param, body) } } ``` ### 路由接口数据 1.使用*Route.Context 上下文获取当前请求参数 ``` v1.Post("/api", func(c *Route.Context) { keyName:= c.GetPostInt("keyName") }) ``` 2.响应json ``` v1.Get("/test", func(c *Route.Context) { c.JsonResponse(100, "这是测试", nil) }) ```