GO框架之gin入门 | 青训营

352 阅读3分钟

GO框架之gin入门

这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天

一、gin发展历史

Gin最早是在2014年由Manu Martinez-Almeida创建的,他是一个来自阿根廷的软件工程师,他在GitHub上发布了Gin的第一个版本

Gin的灵感来源于Martini,一个用Go语言编写的简洁而强大的web框架,但是Martini使用了反射机制,导致性能较低(github.com/gin-gonic/g…)

二、gin是什么?

Gin是一个使用Go语言开发的Web框架。

它提供类似Martini的API,但性能更佳,速度提升高达40倍。(这里不多赘述Martini是什么了)

三、环境配置

    go get github.com/gin-gonic/gin

四、gin常用方法

  • Gin的常用方法

    • Gin只需调用gin.Default()函数即可来创建一个web应用实例
    • Gin支持使用GET、POST、PUT、DELETE等HTTP方法来定义路由规则,并且可以使用参数和通配符来匹配动态URL。
    • Gin可以通过中间件来处理HTTP请求,中间件是一些在请求到达最终处理函数之前或之后执行的函数,可以用来实现日志、授权、压缩等功能。
    • Gin可以通过c.JSON()、c.XML()、c.HTML()等方法来渲染不同格式的响应数据,并且可以自定义渲染器。
    • Gin可以通过c.Bind()、c.BindJSON()、c.BindXML()等方法来解析和验证请求数据,例如检查JSON中是否存在必需的值。
    • Gin可以通过c.Param()、c.Query()、c.DefaultQuery()、c.PostForm()、c.DefaultPostForm()等方法来获取请求中的参数和表单数据。

下面是代码示例

func main(){
//创建实例
    r := gin.Default()
    
    //设置网页图标  
ginServer.Use(favicon.New("./OIG.jpg"))  

//加载静态页面  
ginServer.LoadHTMLGlob("templates/*")  

//加载静态文件 相对路径 绝对路径  
ginServer.Static("/static", "./static")
    
//监听端口
    r.run(":8080")
}

然后我们go run .就可以开启服务了 在浏览器输入 localhost:8080然后回车
这时候我们可以在浏览器上看见

404 page not found

这是因为我们还没有设置访问路径,我们写一个get响应,在访问/ping时页面会返回一个json数据{"msg":"pong"}

 func main(){
//创建实例
    r := gin.Default()
    //localhost:8080/ping
    r.GET("/ping", func(context *gin.Context) {  
    context.JSON(200, gin.H{  
    "msg": "pong",  
    })  
})
//监听端口
    r.run(":8080")
}

我们再运行,访问localhost:8080/ping这样服务端就成功给浏览器返回了一个{"msg":"pong"}

我们可以通过gin给我们的*gin.Context.Param方法获取url中的数据

我们再写一个get方法来获取url中携带的参数

  // /user/info/1/xingzhou
  r.GET("/user/info/:userId/:userName", func(ctx *gin.Context) {  
    userId := ctx.Param("userId")  
    userName := ctx.Param("userName")  
    ctx.JSON(200, gin.H{  
        "userId": userId,  
        "userName": userName,  
        })  
    })
    

我们运行,然后浏览器访问localhost:8080/user/info/1/xingzhou

可以看见服务端成功将url后面携带的参数给返回 ,当然,不止这一种方式

    // /user/info?userId=1&userName=xingzhou  
r.GET("/user/info", myHandler(), func(ctx *gin.Context) {  

    userId := ctx.Query("userId")  
    userName := ctx.Query("userName")  
    ctx.JSON(200, gin.H{  
    "userId": userId,  
    "userName": userName,  
    })  

})

获取前端返回的表单

  //获取表单数据  
 ginServer.POST("/user/add", func(ctx *gin.Context) {  
    userName := ctx.PostForm("userName")  
    password := ctx.PostForm("password")  

    ctx.JSON(200, gin.H{  
        "smg": "ok",  
        "userName": userName,  
        "password": password,  
    })  
 })
 
 
 
 

处理返回的文件流数据,需要编写相应的前端组件

  // 处理文件流请求  
ginServer.POST("/upload", func(ctx *gin.Context) {  

    //从请求中读取文件  
    f, err := ctx.FormFile("f1")  
    if err != nil {  
    ctx.JSON(http.StatusBadRequest, gin.H{  
        "err": err.Error(),  
    })
    } else {  
    //将文件保存至本地  
    ctx.JSON(200, gin.H{  
            "smg": "ok",  
            }
       //存储当前文件夹下的files文件夹下
    dst := fmt.Sprintf("./files/%s", f.Filename)  

    ctx.SaveUploadedFile(f, dst)  
    }  
})

可以实现路由重定向,当访问/test时直接跳转哔哩哔哩

  //路由  
ginServer.GET("/test", func(ctx *gin.Context) {  
//重定向 301  
    ctx.Redirect(301, "https://www.bilibili.com")  
})

当访问了不存在的路径时,实现404重定向(这里需要在templates文件夹下创建404.html)

 //404  
ginServer.NoRoute(func(ctx *gin.Context) {  
ctx.HTML(404, "404.html", nil)  
})

可以创建路由组,访问时需要加上路由前缀/User

//路由组  
userGroup := ginServer.Group("/User")  

userGroup.GET("/add")  
userGroup.POST("/login")  
userGroup.POST("/logout")  


相关的前后端资源文件在ygxiaobai111/go_gin: 一个用于学习gin的小Demo (github.com)(运行前记得go mod tidy)