Golang gin框架的基本使用汇总

496 阅读2分钟

一.准备步骤

  1. 下载gin依赖
go get -u github.com/gin-gonic/gin
  1. 新建一个main,直接开袋即食

image.png

r := gin.Default() //生成一个默认的gin配置的服务
r := gin.New() // 生成一个全新的gin服务

二. 定义http接口

r.GET("getXX", func(context *gin.Context) {
   context.String(200,"get请求")
})
r.POST("postXX", func(context *gin.Context) {
   context.String(200,"post请求")
})
r.PUT("putXX", func(context *gin.Context) {
   context.String(200,"put请求")
})
r.DELETE("deleteXX", func(context *gin.Context) {
   context.String(200,"delete请求")
})

定义一个static静态文件接口 image.png

三.定义Group

groupA := r.Group("/groupA")
groupA.GET("/getXX", func(context *gin.Context) {
   context.String(200, "get请求")
})

四.返回类型

4.1 返回string

r.GET("/stringReturn", func(context *gin.Context) {
   context.String(http.StatusOK,"返回string")
})

4.2 返回json

r.GET("/jsonReturn", func(context *gin.Context) {
   user := &app.User{2, "张三"}
   context.JSON(http.StatusOK, user)
})

4.3 返回xml

r.GET("/xml", func(context *gin.Context) {
   context.XML(http.StatusOK, gin.H{
      "aa":   "asd",
      "bb":   22,
      "data": &app.User{Name: "asdads", Age: 2},
   })
})

这里有一个gin.H定义的type类型,可以方便返回map接口的格式。

type H map[string]any

返回是

image.png

4.4 返回html

r.LoadHTMLGlob("html/*")
r.GET("/index", func(context *gin.Context) {
   context.HTML(http.StatusOK, "index.html", gin.H{
      "title": "我是后台数据",
   })
})

这里返回html要注意需要LoadHTMLGlob指定加载的html路径。

五.定义middleware(类似spring的拦截器)

5.1全局middleware

func globalMidWare1(context *gin.Context) {
   fmt.Println("全局的中间件1执行")
}

func globalMidWare2(context *gin.Context) {
   fmt.Println("全局的中间件2执行")
}

func main() {
   r := gin.Default()
   r.Use(globalMidWare1, globalMidWare2)
   r.Run(":8081")
   }

5.2 group局部middleware

funcARouter := r.Group("/funcA")

funcARouter.Use(func(context *gin.Context) {
   //do something
})

或者

funcARouter := r.Group("/funcA", func(context *gin.Context) {
   //do something
})

5.3 单个接口middleware

r.GET("/hello",
   func(context *gin.Context) {
      //do something
   },
   func(context *gin.Context) {
      //do something
   })
   
   注意这里r可以是gin的全局router,也可以是单个group的router

六.context其他使用

6.1 context.Next()

// 调用该请求的剩余处理逻辑 middleware中
context.Next()

使用后,接口继续执行处理后续的handle。如果这里在context.Next()前面的代码块和后面的代码块,可以写一些自己的逻辑,类似java的aop切面。

6.2 context.Abort()

// 终止处理  middleware中
context.Abort()

使用后,接口终止处理后续的handle

6.3 context.Set(key string, value any) 和 context.Get(key string) (value any, exists bool)

context.Set("AAA",123)

这里类似java的requestAttribute

va, _ := context.Get("AAA")

6.4 获取get、post的值

// get请求
a := context.Query("Age")
b := context.DefaultQuery("b", "defaultB")

// post请求
a := context.PostForm("aa")
a := context.DefaultPostForm("aa","dd")

path路径参数

// pathVariable参数,类似spring的@PathVariable, 使用 ":paramName"
r.GET("/pathVariable/:param", func(context *gin.Context) {
   param := context.Param("param")
})

参数绑定可以使用context.ShouldBind

age := context.Query("Age")
b := context.DefaultQuery("b", "defaultB")
c := app.User{}
context.ShouldBind(&c)

post表单传输文件

// 接受单个文件
fileHeader,err := context.FormFile("fileName")

// 接受同名的多个文件
formFiles, _ := context.MultipartForm()
for _, file := range formFiles.File["fileName"] {
   context.SaveUploadedFile(file, ".static/upload"+file.Filename)
}

image.png

6.5 context操作Cookie

设置cookie

Context.SetCookie(name, value string, maxAge int, path, domain string, secure, httpOnly bool) 
  • maxAge int是单位为秒的过期时间。如果要删除,maxAge设置负数。等于0表示无过期时间。
  • path 表示只有这个路径下才能访问这个cookie
  • domain 表示域名,不需要http://https://如果想要多个二级域名共享cookie,domain可以设置“.abc.com”,如果是本地,就是localhost(没有端口号)。这样域名为aaa.abc.com和bbb.abc.co都可以访问到这个cookie。
  • secure 为true表示只有https才有效,http无效
  • httpOnly 为true表示只有后端能修改,前端无法通过js脚本修改

读取cookie

(c *Context) Cookie(name string) (string, error)

本文正在参加技术专题18期-聊聊Go语言框架