-
點,可以得到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/[email protected]
查看全部 -
待了解的前置知識:
- 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
查看全部 -
優雅關停!
查看全部 -
其他補充
優雅關停
模板渲染
自動證書配置
查看全部
舉報