目录

一 gin框架初识

1.1 helloworld

gin框架中的路由是基于httprouter开发的。HelloWorld:

package main

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

func main() {

    r := gin.Default()    //Default返回一个默认路由引擎

    r.GET("/", func(c *gin.Context) {

        username := c.Query("username")

        fmt.Println(username)

        c.JSON(200, gin.H{
            "msg":"hello world",
        })
    })

    r.Run()            //默认位于0.0.0.0:8080,可传入参数 ":3030"

}

二 参数获取

2.1 get请求参数

常见参数获取方式:

c.Query("username")
c.QueryDefault("username","lisi")       //如果username为空,则赋值为lisi

路由地址为:/user/:name/:pass,获取参数:

name := c.Param("name")

2.2 post请求参数获取

name := c.PostForm("name")

2.3 参数绑定

参数绑定利用反射机制,自动提取querystring,form表单,json,xml等参数到结构体中,可以极大提升开发效率。

package main

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

type User struct {
    Username string `form:"username" json:"username" binding:"required"`
    Password string `form:"password" json:"password" binding:"required"`
}

func login(c *gin.Context) {

    var user User

    fmt.Println(c.PostForm("username"))
    fmt.Println(c.PostForm("password"))

    err := c.ShouldBind(&user)
    if err != nil {
        c.JSON(http.StatusBadRequest, gin.H{
            "error": err.Error()
        })
    }

    c.JSON(http.StatusOK, gin.H{
        "username": user.Username,
        "password": user.Password,
    })
}


func main() {

    router := gin.Default()

    router.POST("/login", login)

    router.Run(":3000")
}

三 静态文件

静态化当前目录下static文件夹:

    router := gin.Default()

    router.Static("/static", "./static")

    router.Run(":3000")

注意:同样推荐使用go build,不要使用开发工具的run功能。

四 结果返回

4.1 返回JSON

c.JSON(200,gin.H{"msg":"OK"})
c.JSON(200,结构体)

4.2 返回模板

    router.LoadHTMLGlob("templates/**/*")

    router.GET("/test/index", func(c *gin.Context){
        c.HTML(http.StatusOK, "test/index.tmpl", gin.H{
            "msg": "test",
        })
    })

模板文件:index.tmpl


{{define "test/index.tmpl"}}
<html>

    <head>
    </head>

    <body>

        test...

        {{.}}
        -----
        {{.msg}}

    </body>

</html>

{{end}}

注意事项:不要使用编辑器的run功能,会出现路径错误,推荐使用命令build,项目路径分配如下:

五 文件上传

5.1 单文件上传

 router.POST("/upload", func (c *gin.Context) {
    file, err := c.FormFile("file")
    if (err != nil) {
        c.JSON(http.StatusInternalServerError, gin.H{
            "msg": err.Error(),
        })
        return
    }
    dst := fmt.Sprintf("/uploads/&s", file.Filename)
    c.SavaeUpLoadedFile(file, dst)
    c.JSON(http.StatusOK, gin.H{
        "msg":"ok",
    })
 })

5.2 多文件上传

 router.POST("/upload", func(c *gin.Context) {
        // 多文件
        form, _ := c.MultipartForm()
        files := form.File["upload[]"]

        for _, file := range files {
            log.Println(file.Filename)

            // 上传文件到指定的路径
            // c.SaveUploadedFile(file, dst)
        }
        c.String(http.StatusOK, fmt.Sprintf("%d files uploaded!", len(files)))
    })