Gin框架快速入门

小凯   |     |   Golang学习笔记   |   20分钟   |   188浏览  

简介

Gin 是一个简单、快速且高性能的 Web 框架,适用于构建各种规模的 Web 应用程序。具有优雅的设计和丰富的功能,能够帮助开发者高效地构建和管理 Web 项目。
特点:

  1. 快速和高性能:基于 Radix 树的路由算法,以实现快速的请求匹配和路由分发。
  2. 路由和中间件
  3. 渲染和模板引擎:支持多种常见的渲染器,如 JSON、XML、HTML 等。同时,它也支持使用第三方模板引擎(如 html/template、pongo2 等)来渲染网页模板。
  4. 错误处理和调试:提供了灵活的错误处理机制,可以自定义错误处理函数,以便统一处理和返回错误响应。在开发阶段,Gin 还提供了调试模式,可以输出详细的错误信息,方便排查问题。
  5. 中间件生态和插件:生态系统非常丰富,有许多官方提供的中间件和插件,可以扩展框架的功能。
  6. 完备的文档和活跃的社区

1、下载依赖

go get -u github.com/gin-gonic/gin

2、导入gin包

import github.com/gin-gonic/gin

3、开始使用

  1. 创建实例

var ginServer *gin.Engine = gin.Default()

  1. 定义路由器api接口**/path**

ginServer.GET("/path", func(context *gin.Context){
context.JSON(200, gin.H{"msg", "hello world"})
})

  1. 运行gin服务器,端口为8080

ginServer.Run(":8080")
此时,gin的极简启动完成,可以通过http://127.0.0.1:8080/path访问接口

详细使用

使用示例参考官方文档:官方示例(https://gin-gonic.com/zh-cn/docs/examples/)

设置网站图标

1、导入"github.com/thinkerou/favicon"
2、设置网站图标
ginServer.Use(favicon.New("./favicon.ico"))

加载静态资源

假如说在项目中,有个目录static,里面存放各种允许访问的静态资源。想要被暴露访问,需要在gin中配置:
ginServer.Static("/static", "./static")
前者为访问路径,后者为项目根目录的相对路径。
可以通过http://127.0.0.1:8080/static/..访问相关的静态资源。

加载html模板

gin中可以通过路由访问html资源,通过配置:
ginServer.LoadHTMLFiles("templates/index.html")枚举配置具体的html文件
ginServer.LoadHTMLGlob("templates/*.html")通过表达式配置html文件
此时需要通过路由返回HTML即可渲染对应的HTML模板。

路由

web服务需要通过配置路由才能进行web服务交互。
**ginServer.GET("/path", handleFunc)**配置GET请求,也有POSTPUTDELETE等等请求函数;其中handleFunc(context *gin.Context)为处理业务的参数。
以上方式可以替换成
**ginServer.Handle(http.MethodGet,"/hello", handleFunc)**http.MethodGet可以替换成对应的不同类型的请求方式。

路由组

使用路由组可以将相关的用户路由进行分组,提高代码的可读性和可维护性,并且可以统一地设置路由前缀和应用中间件。
userGroup := ginServer.Group("/user") {
userGroup.GET("/", getUserList)
userGroup.POST("/", createUser)
userGroup.PUT("/:id", updateUser)
userGroup.DELETE("/:id", deleteUser)
}

中间件

中间件(Middleware)是一种用于在请求到达处理函数之前或之后进行处理的函数。中间件可以用于实现一些公共的功能或操作,例如身份验证、日志记录、错误处理等。

//中间件 拦截器...
ginServer.Use(func(context *gin.Context) {
        fmt.Println("中间件拦截器...")
        cookie, _ := context.Cookie("login")
        if cookie != "" {
        //放行
        context.Next()
    } else {
        context.Set("message", "未登录标识")
        //阻止
        context.AbortWithError(http.StatusUnauthorized, errors.New("未登录"))
    }
    })

获取参数

  • 获取请求参数:
    • context.Query("paramName") string //获取参数
    • context.DefaultQuery("password", "default") string // 获取参数,提供默认值
  • 获取restful路径参数:
    • context.Param("id") string
    • restful的参数为类似/:id/斜杠之间有冒号的字段
  • 获取JSON参数:
    • data, _ := context.GetRawData() //获取前端传递的json
    • var mapData map[string]any //创建存放参数的map
    • json.Unmarshal(data, &mapData) //反序列化成json
  • 获取表单参数:
    • context.PostForm("username") string //获取指定单个字段
    • context.GetPostForm("username") (string, bool) //获取指定单个字段, nil为false
    • context.GetPostFormArray("orderIds") []string 获取字段数组
    • context.GetPostFormMap("userInfo") map[string]string //获取字段对象

文件上传

单文件
file, _ := context.FormFile("file") // 获取表单文件
context.SaveUploadedFile(file, "./" + file.Filename) // 上传文件至指定的完整文件路径
多文件
form, _ := context.MultipartForm()
files := form.File["file"]//获取表单多文件切片
... //遍历上传文件

func uploadFileMulti(context *gin.Context) {
    // 获取表单文件
    form, _ := context.MultipartForm()
    files := form.File["file"]

    var mutiMap = make([]map[string]string, len(files))
    for index, file := range files {
        // 上传文件至指定的完整文件路径
        context.SaveUploadedFile(file, "./"+file.Filename)
        log.Println(file.Filename)
        mutiMap[index] = make(map[string]string)
        mutiMap[index]["filename"] = file.Filename
        mutiMap[index]["url"] = "http://127.0.0.1:8080/static/" + file.Filename
        mutiMap[index]["type"] = file.Header["Content-Type"][0]
        mutiMap[index]["suffix"] = strings.Split(file.Filename, ".")[1]
    }
    //返回信息
    context.JSON(http.StatusOK, gin.H{
        "message": "上传成功",
        "files":   mutiMap,
    })
}

// 上传单文件
func uploadFileSingle(context *gin.Context) {
    // 获取表单文件
    file, _ := context.FormFile("file")
    // 上传文件至指定的完整文件路径
    context.SaveUploadedFile(file, "./"+file.Filename)
    log.Println(file.Filename)
    //返回信息
    context.JSON(http.StatusOK, gin.H{
        "message":  "上传成功",
        "filename": file.Filename,
        "url":      "http://127.0.0.1:8080/static/" + file.Filename,
        "type":     file.Header["Content-Type"][0],
        "suffix":   strings.Split(file.Filename, ".")[1],
    })
}

控制日志输出颜色

控制台的日志输出默认是有颜色的。
禁止日志的颜色:
gin.DisableConsoleColor()
强制日志颜色化:
gin.ForceConsoleColor()

将 request body 绑定到不同的结构体中

如果你觉得文章对你有帮助,那就请作者喝杯咖啡吧☕
微信
支付宝
  条评论