GinPackage學習
簡單說明Gin內部函數用法,當作看簡單版文檔就行
http狀態碼不推薦使用數字,使用http.StatusCode
- 開始使用Gin
- 使用go mod init 包名稱 來初始化go mode
- go get github.com/gin-gonic/gin
- 所有跟請求相關得都能在c *gin.Context裡面找到
- 所有跟服務器有關都能再r 裡面找到 → r := gin.Default()
- gin只需要兩行的代碼就能開啟服務器
- 使用Run的話gin會預設開啟8080port
- 如果沒有連接到會出現404
使用Param獲得單一網址的參數,在這個程式中獲得id
- 當你使用瀏覽器將數值輸入進輸入框中,url所呈現出的樣子。
- 使用以下圖片說明的話,q=後就得字串就是queryString
- GET請求 ? 後面的就是queryString參數
- key=value的格式,多個key-value格式用 & 串接
ex: /web/query=peter & age=18
1.使用c.Query
2.使用DefaultQuery函數來設定默認值
3.使用GetQuery來判斷是否有傳遞參數(Query string)
1.使用模板語法來創造發出請求的前端表單
- c.HTML可以在用戶訪問指定的url時渲染出指定的html文件
- r.LoadHTMLFiles可以讓用戶加載出自身所指定的html文件
2.前端表單如下
- 使用html中form的action來決定傳遞的ur需要使用
- Method則是傳遞的方法
- 在form表單中需要使用type為submit的按鈕來傳送請求
3.接收前端POST請求的後端代碼
- 使用c.Request.FormValue(”input的名稱”)
- 使用c.PostForm(”input的名稱") →取道返回值,取不到返回空字符串
- 使用GetPostForm("input的名稱”)來判斷使用者是否有輸入值
此時的/:name/:age 會和 /:month/:year 有衝突
獲得URI參數
- 使用c.Param來獲的路徑參數內容→返回的皆為string類型
但是不能每一次都使用Query或其他必須設定多預設的方法
否則會造成程式碼繁雜且凌亂
- 因此使用到 c.ShouldBind這個函數來幫忙設定
- 因為SholudBind這個函數必須要改到Struct裡面的內容
所以必須傳遞位址而非單純的值
- Go語言中的函數都會是改動原先結構體複製出來的位置址的內容而非自己本身
- ShouldBind之所以能夠知道你所傳遞的值是使用"反射"這個方法
- ShouldBind會跑去接構體中一個個找
- 如果結構體有json標籤可以使用BindJson來獲得傳入的值
使用tag來綁定結構體(tag可以依照使用者自行設定
常用的結構體tag
- **json →**json序列化或反序列化时字段的名称→使用post時,參數值的名稱必須和tag一樣
- **db →**sql模块中对应的数据库字段名
- **form →**gin框架中对应的前端的数据字段名 →input中的name
- **binding →**搭配 form 使用, 默认如果没查找到结构体中的某个字段则不报错值为空, binding为 required 代表没找到返回错误给前端
使用json格式(最常用
- 需要將Struct設定json這個tag,否則會不知道你傳入甚麼
- 前端代碼
- form必須設定enctype="multipart/form-data
因為其中一個input的type是file類型
- 使用c.FormFile讀取前端上傳文件的name
- 使用path包中的Join來串接保存文件的地址
- 使用SaveUploadedFile來保存文件到本地,第一個參數為文件,第二個是文件儲存得位址
- 可以使用r.MaxMultipartMemory來設定最大上傳byte數(默認最大32MB
- 購物中心的註冊,尚未註冊時跳轉到註冊畫面
- 網站的404跳轉
- 第一個參數為http狀態碼 ⇒301→”StatusMovedPermanently"
- 第二個參數是重定向後的位置
- 使用c.Request.URL.Path = “要跳轉的網頁網址” ⇒把請求的URI修改
- r.HandleContext重新定向 ⇒繼續後續的處理
當用戶輸入錯誤的網址or路由時,避免返回到默認的404
- 使用r.NotRoute來避免發生此問題
- 當用戶對不吋在的URL發送請求時由此函數進行處理
- 使用Group避免產生過多重複
- 路由組多用來區分不同的業務線獲API版本
- 中間件用來處理送出請求後發生的重複函數
- Gin的中間件必須是gin.HandleFunc類型
→ gin.HandleFunc類型代表函數參數為c *gin.Context
- 由於GET方法第二個參數可以傳入多個HandleFunc
所以由最先傳入的參數開始處理,因此會先執行m1再接著執行indexFunc
- 使用c.Next來處理後續函數,相當於調用indexFunc
可以使用c.Abort來阻止處理後續函數
- 和前一個範例最大的不同是使用next時會先跑去執行完後續的函數(indexFunc),再回來執行m1
也可以傳入參數,使用參數來判斷(傳入類型為bool的參數
- 使用c.Set來設定要傳入的參數和值(”parms”,”value”)
後續函數可以使用Get來獲得指定參數(必須和Set所設定的parms一樣)的值→Get跨中間件取值
Get的話會返回一個Bool來判斷是否正確,使用MustGet效果一樣但不會返回bool
- gin.Default會默認使用Logger和Recovery中間件
- Logger中間件將Log寫入gin.DefaultWriter
- Recovery中間件會recover所有的panic,如果有panic會返回500響應碼
如果想要自行定義,可以使用gin.New新建一個沒有任何默認中間件的路由
- gin中使用goroutine
- 當在中間件或Handler中啟動新的goroutine
不能使用c *gin.Context而是需要使用其只讀副本c.Copy