点,可以得到struct /map里的值
curl -X GET http://127.0.0.1:8080/api/hello
#出事换环境
https://beego.gocn.vip/beego/zh/developing/bee/env.html
#go语言安装主根目录
export GOROOT=/usr/local/go
#替换你的目录#GOPATH 是自己的go项目路径,自定义设置export GOPATH=/Users/ding/go_workspace #替换你的目录#GOBIN 当我们使用go install命令编译后并且安装的二进制程序目录export GOBIN=$GOPATH/bin# 启用 Go Modules 功能export GO111MODULE=on# 配置 GOPROXY 环境变量。你可以换成你喜欢的 proxyexport GOPROXY=https://goproxy.cn,direct# 加入环境变量中export PATH=$PATH:$GOROOT/bin:$GOBIN
# 创建文件夹
mkdir -p $GOPAH/src/github.com/rupid/learn-gin
# 进入learn-gin文件夹
cd $_
# 初始化mod
go mod init
# 拉去gin的模块
go get -v github.com/gin-gonic/gin@v1.7
待了解的前置知识:
- go基本语法
- go写成基本知识
开发工具
- goland
老师是在liunx下教学的,windows的命令行更改如下
mkdir -p $GOPATH/src/github.com/e421083458/gin_test_project 换成 mkdir -p $env:GOPATH/src/github.com/e421083458/gin_test_project
export GO111MODULE=on 换成 go env -w GO111MODULE=on
这个on不能是大写,而且只有on,off,auto
如果设置错了值,可以看这篇文章
windows错误设置GO111MODULE报错解决
设置好GO111MODULE之后,可以设置代理,下载速度会快一点
go env -w GOPROXY=https://goproxy.cn,direct
自动申请证书
autotls.Run(r, "域名")
流程:
1、生成本地密钥
2、发送密钥到证书颁发机构 => 获取私钥
3、私钥验证,验证后保存,下次请求用私钥加密 => 自动下载证书
1、加载模板文件
r.LoadHTMLGlob("template/*")
2、处理模板数据
c.HTML(200, "index.html", gin.H{ "title": "test_gin_template" })
package mainimport ( "context" "github.com/gin-gonic/gin" "log" "net/http" "os" "os/signal" "syscall" "time")func main() { r := gin.Default() r.GET("/other_shutdown", func(c *gin.Context) { time.Sleep(10*time.Second) c.String(200, "test other shutdown") }) srv := &http.Server{ Addr: ":8085", Handler: r, } go func() { if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed { log.Fatalf("listen:%s\n", err) } }() quit := make(chan os.Signal) signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) <-quit log.Println("shutdown server...") ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() if err := srv.Shutdown(ctx); err != nil { log.Fatal("server shutdown:", err) } log.Println("server exiting") }
1、时间库使用
time.Sleep(10*time.Second) // 表示等待10秒
2、使用http.Server 构建server
srv := &http.Server{ // 地址 Addr: ":8085", Handler: r, }
3、goroutine创建协程并使用
go func() { if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed { } }()
4、信号 os.Signal - 请求拦截
quit := make(chan os.Signal) // 捕获 ctrl+c 和 kill -15 终止两类, kill -9捕获不到 signal.Notify(quit, syscall.S IGINT, syscall.SIGTERM) // 阻塞channel <-quit
5、设置超时的上下文
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
6、defer
7、执行关闭服务器
srv.Shutdown(ctx)
package main import ( "fmt" "github.com/gin-gonic/gin" "net/http" ) func IPAuthMiddleware() gin.HandlerFunc { return func(c *gin.Context) { ipList := []string{ "127.0.0.2", } flag := false clientIP := c.ClientIP() for _, ip := range ipList { if ip == clientIP { flag = true break } } if !flag { c.String(http.StatusUnauthorized, "%s not in ip list", clientIP) c.Abort() } } } func main() { r := gin.Default() r.Use(IPAuthMiddleware()) r.GET("whitelist_middleware_gin", func(c *gin.Context) { c.String(200, c.ClientIP()) }) err := r.Run() if err != nil { fmt.Println(err) } }
1、ip数组初始化:
ipList := []string{ "127.0.0.2", }
2、获取客户端ip
c.ClientIP()
3、自定义中间件:
3.1 定义中间件方法 func IPAuthMiddleware() gin.HandlerFunc { return func(c *gin.Context) { } } 3.2 使用中间件 r.Use(IPAuthMiddleware())
4、中间件校验不通过直接退出
c.Abort() // 不终止退出的话,会继续调用接口,输出接口内容,与中间件检验拦截目的不符
package main import ( "bytes" "fmt" "github.com/gin-gonic/gin" "io/ioutil" "net/http" ) func main() { r := gin.Default() r.POST("/test", func(c *gin.Context) { bodyBytes, err := ioutil.ReadAll(c.Request.Body) if err != nil { c.String(http.StatusBadRequest, err.Error()) c.Abort() } c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(bodyBytes)) name := c.PostForm("name") c.String(http.StatusOK, "%s, %s", name, string(bodyBytes)) }) err := r.Run() if err != nil { fmt.Println(err) } }
curl -X POST "http://127.0.0.1:8080/test" -d "name=zqunor"
虽然能实现,但是感觉回传不是个好方案。
c.ShouldBind();百年规定结构体
c.Query("test","默认值");//获取url参数
获取参数
自定义验证规则4
自定义验证规则3
自定义验证规则2
自定义验证规则1
结构体验证
获取body内容
获取请求参数
请求路由泛绑定~
设置静态资源
路径带参数 uri
优雅关停!
其他补充
优雅关停
模板渲染
自动证书配置
中间件
使用 gin 中间件
自定义 ip 白名单中间件
获取请求参数
获取 GET 请求参数
获取 POST 请求参数
获取 Body 值
获取参数绑定结构体
开发环境准备
golang 1.12
gin 1.4.0
goland
期待有更详细的课程,赞赞赞!!!
gin路由的写法就是比较爽