Gin
#Go #Web框架
Intro
- RESTful
- 规范动词
Template
.tpl/.tmpl- {{.xxx}} —> 传入的数据
- 定义—》解析—〉渲染
- 定义
- 解析
- template.ParseFiles()
- 渲染
- Execute()
- 模版的数据在Execute()中的参数,用map传入
- 模版中{{$v1 = 100}} 定义了一个值为100的变量v1
- 模版if、range、with
- 模版嵌套
- {{template “xxx.tpl”}}
- 被包含的模版一定要后解析
Gin渲染模版
- router.LoadHTMLFiles(“./index.tpl”) 》 解析模版
- ctx.HTML(200,”index.tpl”,gin.H{“name”:”Hello”})
- 这就是gin渲染html模版,注意要写状态码,gin.H实质上是一个map[string]interface{},就相当于模版执行时向内传的参数
Gin返回json
- c.json(200,gin.H{} 》 在router的函数选项中写入,用map存数据
- 或者构建结构体+tag
Gin获取参数
- queryString
- context.Query(“query”)
- context.GetQuery()
- Context.DefaultQuery() //带默认值
- & 连接多个查询字符串中的参数,每个都在代码获取一下
Gin获取form
- 一次请求对应一个响应!!
- 一次请求对应一个响应!!
- 一次请求对应一个响应!!
- Router.Post(“/login”,func()),函数体当中,使用context.PostForm()来获取表单提交的信息
Gin获取Path
- /:name/:age 》 路由的路径:从路径中获取name,age
- context.Param(“name”)
- 注意!不同的路径之间可能会有冲突
Gin参数绑定
- Context.ShouldBond() 》 将请求的参数和后端结构体绑定,就不需要一个个手动解析了
- 先声明一个用于绑定的结构体实例
- 需要传入引用!shouldbond()会对传入的结构体内容修改!
- 结构体成员首字母大写!这样才能被找到成员
- 注意查询字符串的变量首字母也得大写
Gin文件上传
- Html中获取文件到form,类型必须是multipart-form!
- context.FormFile() 》 从表单请求中获取文件,参数是上传文件的input标签的name
- context.SaveUploadedFile(file,path) 》 保存取得的文件到本地,参数为获取文件的变量和存储路径
- Context.MultipartForm() > 获取多个文件,存入slice
Gin重定向
- context.Redirect(http.StatusMovedPermantly,” www.baidu.com ”) 》 网站重定向,浏览器地址改变
- context.Request.URL.Path = “/“ 〉 路由重定向
- Router.HandleRequest(context) 》 执行请求,浏览器地址不变
Gin路由&路由组
- router.Any() 〉 处理所有请求
- Router.NoRoute() 》 设置没有路由时的情况,设置默认404页面
- 路由组:给路径加入前缀
- xxxGroup:=router.Group(“/xxx”) > 设置组
- xxxGroup.Get() 》 接下来在路由中就可以省去xxx这一部分,会默认加上/xxx
- 路由组可以嵌套
Gin中间件
- 允许在处理请求时加入用户自己的函数(钩子函数hook),即中间件
- 适合公共业务逻辑
- 登录认证
- 权限认证
- 耗时统计
- 数据分页
- 记录日志
- ……..
- 方法1:在路由中加入多个HandleFunc
- Context.Next() 调用下一个处理函数——可以在next之后继续写其他语句,应用于 ep.统计耗时的场景
- Context.Abort() 阻止调用后一个处理函数
- 方法2: router.use(HandleFunc) 》 全局调用中间件
- 通常采用闭包
- 路由组可以在设置的时候增加中间件,在router.Group(“/“)添加
- 使用context.set() & context.get(),可以在中间件之间传递值
- 默认路由器是会调用Logger() 和 Recovery()中间件
- 在go routine中只传入拷贝,不要传入引用!
项目结构
- controller
- HandleFunc
- DAO
- 数据库连接、初始化
- model
- 增删改查
- router
- 路由写在函数体里,返回一个配置好的路由器回到主函数