一.准备步骤
- 下载gin依赖
go get -u github.com/gin-gonic/gin
- 新建一个main,直接开袋即食
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静态文件接口
三.定义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
返回是
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)
}
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语言框架