Gin框架入门 | 青训营

59 阅读4分钟

Gin框架入门

Gin框架简介

Gin框架是一个非常受欢迎的Golang Web框架,它具有语法简单明了的优点,使得初学者能够迅速入门。

Gin的Hello World

个人觉得,使用gin编写web应用不像其他框架那样。一看头都大了,给人感觉封装的东西太多了。下面是Gin的Hello World示例。

package main

import (
    "github.com/gin-gonic/gin"
    "net/http"
)

func main() {
    router := gin.Default()
    router.GET("/", func(c *gin.Context) {
        c.String(http.StatusOK, "Hello World")
    })
    router.Run(":8000") 
}

编写完成后,使用go build, go run就可以把这个程序跑起来了,然后在控制台还会有详细的Gin自带的日志,给我这个初学者一种保姆式的感觉。 控制台中会输出这样一行日志

[GIN-debug] Listening and serving HTTP on :9999

说明咱们的服务已经运行在8000端口上了。

这个时候在浏览器中输入127.0.0.1:8000就可以看到打印了Hello World,并且日志也输出了这次请求。

也可以使用Postman这种接口测试工具来发送Http请求。

然后来逐一看一下程序作了什么

  1. router := gin.Default()使用Gin的Deault方法创建一个默认的路由器。
  2. 然后用Http方法绑定路由规则和路由函数。路由规则就是url地址中的路径。路由函数的参数一定是gin.Context类型的指针,这种类型是上下文类型,值得注意的是,这个上下文类型保存有request和response。
  3. 我们看到路由函数中的唯一一行代码c.String(http.StatusOK, "Hello World"),代表response的状态码是200,并且返回体中的数据是一个strinf类型,值为Hello World.
  4. 最后启动路由的Run方法监听某个端口,记得在运行大项目的demo代码时,由于我的80端口已经被占用了,导致日志输出端口已被占用,并且直接结束了程序。

Gin响应

关于响应的部分首先要了解Http协议的响应,重要的是要知道响应码的含义,比如响应码200表示正常响应。

返回字符串

上面的Hello World程序中

返回json

c.JSON(http.StatusOK, gin.H{"user": "hanru", "message": "hey", "status": http.StatusOK})

这里注意到gin.H{},看了看源码,发现能够理解

gin.H定义是map[string]interface{},

而interface{} 可以代表任意类型,

interface{} 就是一个空接口,所有类型都实现了这个接口,所以它可以代表所有类型,

所以我们可以以map的形式插入任意类型数据

返回html

首先使用LoadHTMLGlob()来加载某个目录下的Html文件,才能够使用它们

或者使用LoadHTMLFiles()也可以加载Html文件

//加载模板
router.LoadHTMLGlob("templates/*")
//router.LoadHTMLFiles("templates/template1.html", "templates/template2.html")
//根据完整文件名渲染模板,并传递参数
c.HTML(http.StatusOK, "index.html", gin.H{
  "title": "Main website",
})

响应文件

router.StaticFS("/static", http.Dir("static/static"))
router.StaticFile("/titian.png", "static/titian.png")

router.StaticFS()是响应一个文件目录 在golang总,没有相对文件的路径,它只有相对项目的路径

网页请求这个静态目录的前缀, 第二个参数是一个目录,注意,前缀不要重复

router.StaticFile()是响应单个文件 配置单个文件, 网页请求的路由,文件的路径

Gin请求

同样的Gin也封装了一些函数让程序员可以方便的获取到请求的参数。

查询参数

func _query(c *gin.Context) {
     user := c.Query("user"))
}

如果一个http请求使用GET方法,url是这种 127.0.0.1/?user = coco 通过query函数就可以查询到该参数的值

表单参数

user := c.PostForm("user")

和查询参数类似,如果是一个带post表单的http post请求,使用该方法可以查询到参数的值

json参数

json参数也是http协议请求中经常带的值

func _bindJson(c *gin.Context, obj any) (err error) { 
    body, _ := c.GetRawData() 
    contentType := c.GetHeader("Content-Type")
    switch contentType { 
    case "application/json": 
        err = json.Unmarshal(body, &obj) 
        if err != nil { 
            fmt.Println(err.Error()) 
            return err } 
        } 
    return nil 
}

通过_bindJson函数就可以把json数据拿出来了,一般还要自己构造一个结构体来匹配json。

中间件

一个简单的中间件写法

我们回到最开头的Hello World程序,想要添加一个简单的中间件可以这样做

func m1(c *gin.Context) { 
    fmt.Println("m1 in.........") 
}

把这个函数放入r.GET中,并且放在输出Hello World的方法前面,就可以了。就向下面这样。 这样程序就会先执行m1,在执行最后一个参数中的函数,并且,中间件可以不止一个,执行顺序也是从前到后

router.GET("/", m1, func(c *gin.Context) {
        c.String(http.StatusOK, "Hello World")
    })

可以用c.Abort()来退出执行所有函数。可以用来进行中间件拦截响应