# 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)
})
```