Golang Gin 獲取Restful參數、URL查詢參數,Form 表單參數,JSON格式參數

前言

http請求中, 可以通過URL查詢參數提交數據到服務器,可以通過post的json方式,還有一直方式就是Form表單。Form表單相比URL查詢參數,用戶體驗好,可以承載更多的數據,尤其是文件上傳時,特別方便。

這裏特別推薦 飛雪無情的博客;寫了一些列的gin的使用教程,很時候新手學習

  1. Golang Gin 實戰(一)| 快速安裝入門
  2. Golang Gin 實戰(二)| 簡便的Restful API 實現
  3. Golang Gin 實戰(三)| 路由參數
  4. Golang Gin 實戰(四)| URL查詢參數的獲取和原理分析
  5. Golang Gin 實戰(五)| 接收數組和 Map
  6. [Golang Gin 實戰(六)| 獲取Form表單參數和原理分析](Golang Gin 實戰(六)| 獲取Form表單參數和原理分析)
  7. Golang Gin 實戰(七)| 分組路由源代碼分析
  8. Golang Gin 實戰(八)| JSON渲染輸出
  9. Golang Gin 實戰(九)| JSONP跨域和劫持
  10. Golang Gin 實戰(十)| XML渲染
  11. Golang Gin 實戰(十一)| HTML模板渲染
  12. Golang Gin 實戰(十二)| ProtoBuf 使用和源碼分析原理實現
  13. Golang Gin 實戰(十三)| 中間件詳解看這一篇就夠了
  14. Golang Gin 實戰(十四)| 文件託管、反向代理百度網站、自實現API網關

正文

Gin獲取Restful路由參數

Gin實現路由參數非常簡單:

func main() {
	r := gin.Default()

	r.GET("/users/:id", func(c *gin.Context) {
		id := c.Param("id")
		c.String(200, "The user id is  %s", id)
	})
	r.Run(":8080")
}

Gin的路由採用的是httprouter開源庫,所以它的路由參數的定義和httprouter也是一樣的。

冒號匹配(😃

/users/:id 就是一種路由匹配模式,也是一個通配符,其中:id就是一個路由參數

我們可以通過c.Param("id")獲取定義的路由參數的值。

/users/:id這種匹配模式是精確匹配的,只能匹配一個;例如:

Pattern: /users/:id

/users/123          匹配
/users/哈哈        匹配
/users/123/go      不匹配
/users/             不匹配

星號路由參數(*)

上面我們介紹的是:號的路由參數,這種路由參數最常用。還有一種不常用的就是*號類型的參數,表示匹配所有。

/users/*id爲例:

我們可以通過c.Param("id")獲取定義的路由參數的值。

Pattern: /users/*id

/users/123         匹配
/users/哈哈        匹配
/users/123/go      匹配
/users/            匹配

URL查詢參數(query parames)

URL查詢參數簡稱爲URL參數,是存在於我們請求的URL中,以?爲起點,後面的k=v&k1=v1&k2=v2這樣的字符串就是查詢參數,例如:

http://127.0.0.1:8080/users?name=zzx&age=18

獲取URL查詢參數的方法有多個,我們分別介紹一下,案例:

func main() {
	r := gin.Default()

	r.GET("/", func(c *gin.Context) {
        // Query 就是最常用的一個方法
		c.String(200, c.Query("wechat"))
	})
	r.Run(":8080")
}
/** 方便整理,查詢方法都放到這裏 */

// 獲取 name 對應的值。如果爲空,則返回空字符串;
value := c.Query("name")

// 獲取 name 對應的值,和是否存在 name參數的,ok是 bool 類型
value, ok := c.GetQuery("name")


// 當url中的參數是多選傳遞時,則需要獲取爲數組;
// 例如 ?name="張三"&name="Zach" 
// 相同的key對應了不同的value,則需要使用這種方式
arr := c.QueryArray("name")

// 作用和 QueryArray 相同,只是多了一個是否有指定key的 返回
arr, ok := c.GetQueryArray("name")

// 當我們按Gin要求的 map 格式傳遞參數時,則需要獲取爲map
// 例如 ?ids[a]=1&ids[b]=2&ids[c]=3
// 從以上URL看,關鍵在於key,這個key必須符合map的定義,[]外面的必須相同,也就是ids這個map變量名,
// []裏面的,也就是map的key不能相同,
// 這樣就滿足了Gin定義的把URL查詢參數轉換爲map的格式定義。
myMap := c.QueryMap("ids")

// 作用和 QueryMap 相同,只是多了一個判斷,是否存在對應的key
myMap, ok := c.GetQueryMap("ids")

// 帶默認值的獲取,如果不存在,則用默認值填充
defaultValue := c. DefaultQuery("name","李四")

獲取Form表單參數

通過URL查詢參數提交數據到服務器外,常用的還有通過Form表單的方式。Form表單相比URL查詢參數,用戶體驗好,可以承載更多的數據,尤其是文件上傳,更是簡單。

對於Form表單來說,有兩種提交方式GET和POST。其中GET方式就是上面提到的URL查詢參數的方式,參考即可獲得對應的參數鍵值對,下面主要介紹POST的方式的表單,而Gin處理的也是這種表單。

Gin 對於表單數據的獲取也非常簡單,爲我們提供了和獲取URL查詢參數一樣的系列方法。

這裏需要注意的是保存表單緩存的內存大小,Gin默認給的是32M 如果你覺得不夠,可以提前通過修改MaxMultipartMemory的值增加,比如:
r := gin.Default()
r.MaxMultipartMemory = 100 << 20

func main() {
	r := gin.Default()
	r.POST("/", func(c *gin.Context) {
		name := c.PostForm("name")
		c.String(200, name)
	})

	r.Run(":8080")
}

方便整理,查詢方法都放到這裏

// 獲取 key爲 name的表單值
value := c.PostForm("name")

// 獲取 key爲 name的表單值,多了一個ok,確定是否存在對應的key
value, ok := c.GetPostForm("name")

arr := c.PostFormArray("name")
arr, ok := c.GetPostFormArray("name")

myMap := c.PostFormMap("ids")
myMap, ok := c.GetPostFormMap("ids")

defaultValue := c. DefaultPostForm("name","李四")

Url參數獲取和Form表單參數獲取對比

查詢參數 Form表單 說明
Query PostForm 獲取key對應的值,不存在爲空字符串
GetQuery GetPostForm 多返回一個key是否存在的結果
QueryArray PostFormArray 獲取key對應的數組,不存在返回一個空數組
GetQueryArray GetPostFormArray 多返回一個key是否存在的結果
QueryMap PostFormMap 獲取key對應的map,不存在返回空map
GetQueryMap GetPostFormMap 多返回一個key是否存在的結果
DefaultQuery DefaultPostForm key不存在的話,可以指定返回的默認值
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章