哪種源碼做視頻網(wǎng)站好用知乎軟文推廣
云原生學(xué)習(xí)路線導(dǎo)航頁(yè)(持續(xù)更新中)
本文是golang語(yǔ)言學(xué)習(xí)系列,本篇對(duì)Gin框架的基本使用方法進(jìn)行學(xué)習(xí)
1.Gin框架是什么
- Gin 是一個(gè) Go (Golang) 編寫(xiě)的輕量級(jí) http web 框架,運(yùn)行速度非???#xff0c;如果你是性能和高效的追求者
- Gin 最擅長(zhǎng)的就是 Api 接口的高并發(fā),如果項(xiàng)目的規(guī)模不大,業(yè)務(wù)相對(duì)簡(jiǎn)單,這個(gè)時(shí)候我們也推薦您使用 Gin
- Gin 的官網(wǎng):https://gin-gonic.com/zh-cn/
- Gin 官方文檔地址:https://gin-gonic.com/zh-cn/docs/
- 有中文文檔,可以直接看文檔學(xué)習(xí)
- Github 地址:https://github.com/gin-gonic/gin
2.Gin框架快速入門(mén)
2.1.快速入門(mén)
- 有一篇博客寫(xiě)的非常詳細(xì),直接看這個(gè)入門(mén)就行
- Golang gin框架
- 按照上面博客學(xué)習(xí)過(guò)程中,可能遇到的疑問(wèn),寫(xiě)在 2.2 中
2.2.學(xué)習(xí)上面博客可能遇到的問(wèn)題
2.2.1.Json和JsonP的區(qū)別
- JSON(JavaScript Object Notation)和JSONP(JSON with Padding)是兩種用于在網(wǎng)絡(luò)上傳輸數(shù)據(jù)的格式,二者區(qū)別如下。
- JSON(JavaScript Object Notation)
- JSON 是一種數(shù)據(jù)格式,用于在不同的系統(tǒng)之間傳輸數(shù)據(jù)。
- JSON 是純文本,易于閱讀和編寫(xiě),也易于解析和生成。
- JSON 數(shù)據(jù)可以表示為對(duì)象、數(shù)組、字符串、數(shù)字、布爾值和 null。
- JSON 數(shù)據(jù)格式不支持跨域請(qǐng)求。
- JSONP(JSON with Padding)
- JSONP 是 JSON 的一種“使用模式”,用于解決跨域請(qǐng)求的問(wèn)題。
- JSONP 實(shí)際上是在 JSON 數(shù)據(jù)周?chē)艘粋€(gè)函數(shù)調(diào)用,這個(gè)函數(shù)名由客戶端指定。
- JSONP的請(qǐng)求,客戶端需要在url后使用
?
指定一個(gè)callback
查詢參數(shù) - 因此,在上面的博客中,jsonp請(qǐng)求的響應(yīng),會(huì)被客戶端傳入的callback包裹起來(lái),形成callback調(diào)用
- JSONP的請(qǐng)求,客戶端需要在url后使用
- JSONP 的工作原理是通過(guò)動(dòng)態(tài)創(chuàng)建
<script>
標(biāo)簽,將請(qǐng)求發(fā)送到另一個(gè)域上的 JSONP 服務(wù)端點(diǎn),并且該服務(wù)端點(diǎn)返回的數(shù)據(jù)已經(jīng)包含在了指定的函數(shù)調(diào)用中。 - JSONP 允許在不同域之間進(jìn)行數(shù)據(jù)交換,繞過(guò)了瀏覽器的同源策略限制。
- 總結(jié)
- JSON 是一種數(shù)據(jù)格式,而 JSONP 則是使用 JSON 數(shù)據(jù)進(jìn)行跨域請(qǐng)求的一種技術(shù)
- JSONP 通常用于處理由瀏覽器的同源策略引起的限制,允許在不同域之間進(jìn)行數(shù)據(jù)交換
2.2.2.HTML模板渲染講的不清楚
- html渲染,上面博客說(shuō)的不清楚,建議看官方文檔:
- https://gin-gonic.com/zh-cn/docs/examples/html-rendering/
2.2.3.請(qǐng)求參數(shù)綁定結(jié)構(gòu)體重點(diǎn)
-
標(biāo)記的使用
url后使用?傳遞的查詢參數(shù)
、請(qǐng)求體為"user=123&password=456"這種格式的body
,需要結(jié)構(gòu)體設(shè)置 form 才可以使用 gin 的自動(dòng)綁定type Userinfo struct {Username string `form:"user"`Password string `form:"password"` }
- 不過(guò)現(xiàn)在的post請(qǐng)求,請(qǐng)求體為 “application/json”,結(jié)構(gòu)體設(shè)置json標(biāo)記可選
// 設(shè)置json,需要按照json標(biāo)記來(lái),可以綁定 {"user": "123", "pwd": "456"} type Userinfo struct {Username string `json:"user"`Password string `json:"pwd"` }// 沒(méi)有設(shè)置json,則請(qǐng)求體需要和屬性名一致,可以綁定 {"username": "123", "password": "456"} type Userinfo struct {Username string `form:"user"`Password string `form:"pwd"` }
- 路徑參數(shù),需要使用uri參數(shù)
// 接口可以是 */:user/:pwd type Userinfo struct {Username string `uri:"user"`Password string `uri:"pwd"` }
- Header 頭信息綁定,需要使用header參數(shù)
-
gin.Context 的綁定方法使用
- 我們用的最多的綁定方法是
c.ShouldBind()
,可以根據(jù)req的Context-Type自動(dòng)推斷要綁定的類型 - 不過(guò) gin.Context 為 很多類型編寫(xiě)了綁定方法,如果你明確知道前端穿過(guò)來(lái)的數(shù)據(jù)是什么格式,可以直接使用這些方法
- 可以看到,gin.Context有兩個(gè)系列方法,Bindxxx和ShouldBindxxx方法,二者區(qū)別如下
- Bind 系列方法:
- Bind系列方法在綁定失敗時(shí)會(huì)直接將錯(cuò)誤信息發(fā)送給客戶端,并終止請(qǐng)求處理。
- 這意味著如果綁定失敗,客戶端將收到一個(gè)包含錯(cuò)誤信息的響應(yīng),并且請(qǐng)求處理將不會(huì)繼續(xù)進(jìn)行。
- ShouldBind 系列方法:
- ShouldBind系列方法在綁定失敗時(shí)不會(huì)立即將錯(cuò)誤信息發(fā)送給客戶端,而是將錯(cuò)誤信息存儲(chǔ)在上下文中。
- 這使得開(kāi)發(fā)者可以根據(jù)實(shí)際情況自定義錯(cuò)誤處理邏輯,例如返回特定的錯(cuò)誤響應(yīng)、記錄錯(cuò)誤日志等。
- 開(kāi)發(fā)者可以通過(guò)檢查上下文中的錯(cuò)誤信息來(lái)判斷綁定是否成功,并根據(jù)需要采取進(jìn)一步的行動(dòng)。
- Bind 系列方法:
- 我們用的最多的綁定方法是
-
更詳細(xì)的用法,可以學(xué)習(xí):
- Gin 框架學(xué)習(xí)筆記(02)— 參數(shù)自動(dòng)綁定到結(jié)構(gòu)體
- Go學(xué)習(xí)第十五章——Gin參數(shù)綁定bind與驗(yàn)證器
2.2.4.gin.Context.Abort()方法
- gin路由注冊(cè)時(shí),參數(shù)可以填多個(gè)中間件+一個(gè)處理函數(shù)
- 其中參數(shù)位置,gin的中間件,必須放在 處理函數(shù) 前面
- gin的中間件,使用
c.Next
控制是請(qǐng)求到達(dá)時(shí)執(zhí)行,還是請(qǐng)求返回時(shí)執(zhí)行
c.Abort
執(zhí)行后- 當(dāng)前中間件的后續(xù)語(yǔ)句,還會(huì)執(zhí)行
- 但是
c.Next
失效了,后面的中間件和最后的處理函數(shù),都不會(huì)再執(zhí)行 - 執(zhí)行完當(dāng)前中間件,請(qǐng)求就返回了
- 如下面代碼,程序會(huì)輸出
1111111111
和handle time
,但是不會(huì)輸出2222222222
func CalTimeMiddleWare(c *gin.Context) {start := time.Now()c.Abort()log.Info("1111111111")c.Next()log.Infof("handle time is [%d]", time.Since(start).Nanoseconds()) }func MiddleWare2(c *gin.Context) {log.Info("2222222222") }adminRouter.GET("/users", middleware.CalTimeMiddleWare, middleware.MiddleWare2, controller.NewAdminController().List)
2.2.5.使用gin進(jìn)行文件上傳
- 上面的博客里,沒(méi)有寫(xiě)gin上傳文件的內(nèi)容
- 可以直接看 官方文檔的內(nèi)容,寫(xiě)的很詳細(xì)
- 上傳單文件:
- https://gin-gonic.com/zh-cn/docs/examples/upload-file/single-file/
- 上傳多文件:
- https://gin-gonic.com/zh-cn/docs/examples/upload-file/multiple-file/
2.2.6.gin獲取cookie
- gin.Context.Cookie(“key1”)方法,獲取cookie中鍵為key1的值
- 比如下面,c.Cookie(“key1”) 得到的值就是 value1
curl --location 'http://localhost:8080/admin/users' \ --header 'Cookie: key1=value1; key2=value2'
- go代碼寫(xiě)法
v, err := c.Cookie("key1") if err != nil {log.Warnf("don't find cookie in [%s]", c.Request.URL.Path) } c.Set("key1", v)