【笔记】Gin框架学习笔记

目录

一、安装

一、安装

1.在Goland控制台上输入以下语句安装gin

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

如果出现网络错误,就分别执行下述语句后再重新安装

1
2
3
4
# 设置goproxy.io代理
go env -w GOPROXY="https://goproxy.io"
# 设置GO111MOUDLE
go env -w GO111MODULE="on"

示例

1.基础网页demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package main

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

func main() {
router := gin.Default() //router是一个 *engine类型
router.GET("/get", func(c *gin.Context) {
c.JSON(200, gin.H{"message": "use get method"})
})
router.Run()
}
//运行后访问localhost:4000/get,会显示一个JSON页面内容是message: "use get method"
  • router := gin.Default()声明并创建名为router的路由
  • router.GET(“/get”, func(c *gin.Context) {
      c.JSON(200, gin.H{"message": "use get method"})
    
    })是访问触发时,c.JSON()返回一个状态码是200(200等价于http.StatusOK),响应内容是一个JSON格式字符串的响应
    • “.GET”表示用GET方式来处理访问”/get”的请求
    • func(c *gin.Context) {
      c.JSON(200, gin.H{“message”: “use get method”})
      }执行函数gin.Context,其内封装了request和response,其中c是变量名可以随意更改
      • 注意gin.H的H是一个map结构,不是结构体

2.不同的http请求格式示例

1
2
3
4
5
6
7
8
9
router := gin.Default()
router.GET("/get", func(c *gin.Context) { c.JSON(200, gin.H{"message": "use get method"}) })
router.POST("/post", func(c *gin.Context) { c.JSON(200, gin.H{"message": "use post method"}) })
router.PUT("/put", func(c *gin.Context) { c.JSON(200, gin.H{"message": "use put method"}) })
router.DELETE("/delete", func(c *gin.Context) { c.JSON(200, gin.H{"message": "use delete method"}) })
router.PATCH("/patch", func(c *gin.Context) { c.JSON(200, gin.H{"message": "use patch method"}) })
router.HEAD("/head", func(c *gin.Context) { c.JSON(200, gin.H{"message": "use head method"}) })
router.OPTIONS("/options", func(c *gin.Context) { c.JSON(200, gin.H{"message": "use options method"}) })
router.Run()

3.切换输出的格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
router.GET("/json", func(c *gin.Context) {
c.JSON(200, gin.H{"message": "return json data"})
})

router.GET("/string", func(c *gin.Context) {
c.String(200, "message %s", "return string data")
})

router.GET("/yaml", func(c *gin.Context) {
arr := [][]string{
{"one", "two", "three"},
{"four", "five", "six"},
}
c.YAML(200, arr)
})

router.GET("/xml", func(c *gin.Context) {
person := struct { //声明一个匿名结构体
Name string
Age int
}{"Jane", 20}
c.XML(200, fmt.Sprintln(person))
})

4.获取url路径中的参数

  • 定义,:name即表示把出现在这个位置的字符赋值给name属性,最后用c.Params读取
    1
    2
    3
    router.GET("/user/:name/:age/:addr/:sex", func(c *gin.Context) {
    c.JSON(200, fmt.Sprintln(c.Params))
    })
  • 使用
    1
    2
    3
    4
    //若输入的url为http://localhost:8080/user/jane/20/beijing/female?id=999&height=170&wigth=100

    //输出
    "[{name jane} {age 20} {addr beijing} {sex female}]\n"
  • 获取某个指定值的写法
    1
    2
    3
    4
    router.GET("/user/:name/:age/:addr/:sex", func(c *gin.Context) {
    age := c.Param("age")
    c.JSON(200, age)
    })

5.获取url请求中的参数

  • 定义
    1
    2
    3
    4
    5
    6
    router.GET("/user/:name/:age/:addr/:sex", func(c *gin.Context) {
    id := c.Query("id")
    height := c.Query("height")
    wight := c.Query("wight")
    c.JSON(200, gin.H("height": height, "id": id, "wight": wight)}
    })
  • 使用
    1
    2
    3
    4
    //若输入的url为http://localhost:8080/user/jane/20/beijing/female?id=999&height=170&wigth=100

    //输出
    {"height":"170","id":"999","wight":"100"}

6.输出html文件

  • 路由写法
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    package main

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

    func main() {
    router := gin.Default()
    router.LoadHTMLGlob("tem/*")
    router.GET("/index", func(c *gin.Context) {
    c.HTML(200, "index.html", gin.H{"title": "测试", "ce": "123456"})
    })
    router.Run()
    }
  • 根目录\tmp\index.html写法
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>{{.title}}</title>
    </head>
    <body>
    fgkjdskjdsh{{.ce}}
    </body>
    </html>
  • 最终会在localhost:8080/index渲染成以下网页
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>测试</title>
    </head>
    <body>
    fgkjdskjdsh123456
    </body>
    </html>

7.访问不同路径时的分离函数写法,下述代码无论是访问/demo、/test还是/aaaa都会去执行response,这种写法比之前的简简洁多

1
2
3
4
5
6
7
8
9
10
func response(c *gin.Context) {
c.JSON(200, gin.H{"message": "hello world"})
}
func main() {
router := gin.Default()
router.GET("/demo", response)
router.GET("/test", response)
router.GET("/aaaa", response)
router.Run()
}

8.gin的前后端交互写法(以接受token为例)

  • 前端
    1
    2
    3
    4
    5
    6
    7
    8
    <script src="https://cdn.dingxiang-inc.com/fe/common/jquery/1.9.1/jquery.min.js"></script>

    $.ajax({
    type:"GET",
    url:"http://127.0.0.1:8080/index/bar",
    dataType:"text",
    data: { token: token}
    });
  • 后端
    1
    2
    3
    4
    5
    6
    7
    8
    9
    func main(){
    router := gin.Default()
    router.GET("/index/bar", response)
    }

    func response(c *gin.Context){
    token := c.Query("token") //从这里之后就可以用token的值了,注意是string类型
    .....
    }

9.测试时,显示字符串用法

1
2
3
4
5
6
func response(c *gin.Context){
str1 := "str01"
str2 := "str02"
c.String(200, str1 + str2 + "!")
}
//最终会在页面上显示str01str02!