Go 语言中的 gin 框架

Gin 是一个用 Go (Golang) 编写的 HTTP web 框架。

官方文档

假如还没有装置Go语言开发环境,参阅一下我的这篇文章:

第 N 次Hello World ! Ready ?Go !

码云地址

完好demo代码放在码云上了,需自取

Gitee

新建项目初始化,以及装置

新建文件夹后,初始化 go.mod 文件

//初始化
go mod init gin

下载装置Gin

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

tips:踩坑指南

go get 指令下载gin包时出现报错

go在1.13版别后,默许敞开了:

GOSUMDB=sum.golang.org

而这个网址sum.golang.org 在国内是无法拜访,故需求关闭

解决方案

go env -w GOSUMDB=off

更换国内源

go env -w GO111MODULE=on

go env -w GOPROXY=mirrors.aliyun.com/goproxy/,di…

首要,运用Gin输出一个 Ready?Go!

新建文件

在文件夹中新建 main.go 文件

导入Gin

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

假如运用比如 http.StatusOK 之类的常量,则需求引进 net/http 包

import "net/http"

官网的demo

package main
import "github.com/gin-gonic/gin"
func main() {
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "pong",
})
})
r.Run() // 监听并在 0.0.0.0:8080 上发动服务
}

自己的代码

简略分析一下,每一步做了什么

package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
        // 创建服务,Default回来一个默许的路由引擎
        ginServer := gin.Default()
        // GET 办法, 增加路由地址和回调函数
        // Gin进行了封装,把request和response都封装到了gin.Context的上下文环境中。
        ginServer.GET("/", func(context *gin.Context) {
        context.String(http.StatusOK, "Ready?Go!")
    })
    // 服务器端口 假如不传端口号,默许8080
    ginServer.Run(":8082")
}

运行项目,经过指令发动,或者直接在IDE开发工具中发动。

go run main.go

浏览器拜访地址:

http://localhost:8082/

成功输出:Ready?Go!

看一下上面的代码,回调函数中的 gin.Context

除了回来 Json 和 String 当然还能够回来 HTML页面。

加载静态资源和页面

呼应一个前端页面

// 呼应一个前端页面
ginServer.GET("/index", func(context *gin.Context) {
    context.HTML(http.StatusOK, "index.html", gin.H{"title": "gin web页面"})
})

运用 ico 文件

装置指令

go get "github.com/thinkerou/favicon"
// 运用 favicon.ico 文件
ginServer.Use(favicon.New("./favicon.ico"))

加载静态页面

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

加载资源文件

// 加载资源文件
ginServer.Static("/static", "./static")

项目结构

 Go 语言中的 Gin 框架

点击概况,查看完好代码

package main
import (
   "github.com/gin-gonic/gin"
   "github.com/thinkerou/favicon"
   "net/http"
)
func main() {
   // 创建服务,Default回来一个默许的路由引擎
   ginServer := gin.Default()
   // 运用 favicon.ico 文件
   ginServer.Use(favicon.New("./favicon.ico"))
   // 加载静态页面
   ginServer.LoadHTMLGlob("templates/*")
   // 加载资源文件
   ginServer.Static("/static", "./static")
   // 呼应一个前端页面
   ginServer.GET("/index", func(context *gin.Context) {
      context.HTML(http.StatusOK, "index.html", gin.H{"title": "gin web页面"})
   })
   // 服务器端口
   ginServer.Run(":8082")
}    

Restful API

Gin 是一个标准的 Web 服务框架

遵循 Restful API 接口标准

// Gin RESTful API
ginServer.POST("/user", func(context *gin.Context) {
    context.JSON(200, gin.H{"message": "post user"})
})
ginServer.PUT("/user", func(context *gin.Context) {
    context.JSON(200, gin.H{"message": "put user"})
})
ginServer.DELETE("/user", func(context *gin.Context) {
    context.JSON(200, gin.H{"message": "delete user"})
})

参数处理

Query接纳参数

Query接纳参数,经过 gin.Context 的 Query 函数获取参数。

// 接纳前端传递过来的参数
ginServer.GET("/user/info", func(context *gin.Context) {
    userid := context.Query("userid")
    username := context.Query("username")
    context.JSON(http.StatusOK, gin.H{
        "userid": userid,
        "username": username,
    })
})

Param 函数获取恳求 Path 中的参数

path 参数,可经过 Param 函数获取恳求 Path 中的参数。

Path 途径中参数以:开头。

// userinfo/info/123/orzr3
ginServer.GET("/user/info/:userid/:username", func(context *gin.Context) {
    userid := context.Param("userid")
    username := context.Param("username")
    context.JSON(http.StatusOK, gin.H{
        "userid": userid,
        "username": username,
    })
})

传递 json 数据

// 传递 json 数据
ginServer.POST("/json", func(context *gin.Context) {
    // request.body
    data, _ := context.GetRawData()
    var m map[string]interface{}
    // 包装成json 数据
    _ = json.Unmarshal(data, &m)
    context.JSON(http.StatusOK, m)
})

运用 postman 测试

 Go 语言中的 Gin 框架

表单提交示例

web页面代码

<form action="/user/add" method="post">
    <p>username: <input type="text" name="username" /></p>
    <p>password: <input type="text" name="password" /></p>
    <button type="submit">提交</button>
</form>

go代码

// user/add 增加数据
// 支持函数式编程 java不能把函数作为参数传递,go能够
ginServer.POST("/user/add", func(context *gin.Context) {
    // 获取前端传递过来的参数
    username := context.PostForm("username")
    password := context.PostForm("password")
    if username == "" || password == "" {
        context.JSON(http.StatusOK, gin.H{
        "code": 400,
        "msg": "参数错误",
        })
        return
    }
// 回来给前端
    context.JSON(http.StatusOK, gin.H{
        "msg": "ok",
        "username": username,
        "password": password,
    })
})

 Go 语言中的 Gin 框架

点击提交后,触发action恳求: /user/add

{“msg”:”ok”,”password”:”222″,”username”:”11″}

其他

路由重定向

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

404 NoRoute

// 404 NoRoute
ginServer.NoRoute(func(context *gin.Context) {
    // context.JSON(http.StatusNotFound, gin.H{
    // "code": 404,
    // "msg": "404 not found",
    // })
    context.HTML(http.StatusNotFound, "404.html", nil)
})

路由组

// 路由组 /system/add 路由组的写法
systemGroup := ginServer.Group("/system")
{
    systemGroup.GET("/add", func(context *gin.Context) {
        context.JSON(http.StatusOK, gin.H{
            "msg": "system add",
        })
    })
    systemGroup.DELETE("/delete", func(context *gin.Context) {
        context.JSON(http.StatusOK, gin.H{
            "msg": "system delete",
        })
    })
}

中间件

中间件对HTTP Request恳求进行阻拦处理

// 自定义Go中间件 阻拦器
func MyMiddleware() gin.HandlerFunc {
    return func(c *gin.Context) {
        // Do something before request
        // 经过自定义的中间件,设置的值,在后续处理只要调用了这个中间件,就能够获取到这个值
        c.Set("usersession", "orzr3-123456")
        c.Next() // 一定要调用该办法,不然后续的处理不会被执行
        // c.Abort() // 一旦调用了该办法,后续的处理都不会被执行
        // Do something after request
    }
}

接纳前端传递过来的参数,而且运用中间件

// 接纳前端传递过来的参数,而且运用中间件
ginServer.GET("/user/info/handler", MyMiddleware(), func(context *gin.Context) {
    // 获取中间件中设置的值
    userSession := context.MustGet("usersession").(string)
    // 打印
    log.Println("userSession:================>", userSession)
    userid := context.Query("userid")
    username := context.Query("username")
    context.JSON(http.StatusOK, gin.H{
        "userid": userid,
        "username": username,
        "userSession": userSession,
    })
})

最终的话

以上,假如对你有用的话,不妨点赞保藏重视一下,谢谢

微信公众号: OrzR3

不定期更新一些技术类,生活类,读书类的文章。