Gin学习笔记

115 阅读3分钟

Gin

#Go #Web框架

github.com/gin-gonic/g…

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) 》 全局调用中间件
  • 通常采用闭包

Pasted Graphic 1.png

  • 路由组可以在设置的时候增加中间件,在router.Group(“/“)添加
  • 使用context.set() & context.get(),可以在中间件之间传递值
  • 默认路由器是会调用Logger() 和 Recovery()中间件
  • 在go routine中只传入拷贝,不要传入引用!

项目结构

  • controller
    • HandleFunc
  • DAO
    • 数据库连接、初始化
  • model
    • 增删改查
  • router
    • 路由写在函数体里,返回一个配置好的路由器回到主函数

Gorm

gorm.io/docs/