前言
http請求中, 可以通過URL查詢參數提交數據到服務器,可以通過post的json方式,還有一直方式就是Form表單。Form表單相比URL查詢參數,用戶體驗好,可以承載更多的數據,尤其是文件上傳時,特別方便。
這裏特別推薦 飛雪無情的博客;寫了一些列的gin的使用教程,很時候新手學習
- Golang Gin 實戰(一)| 快速安裝入門
- Golang Gin 實戰(二)| 簡便的Restful API 實現
- Golang Gin 實戰(三)| 路由參數
- Golang Gin 實戰(四)| URL查詢參數的獲取和原理分析
- Golang Gin 實戰(五)| 接收數組和 Map
- [Golang Gin 實戰(六)| 獲取Form表單參數和原理分析](Golang Gin 實戰(六)| 獲取Form表單參數和原理分析)
- Golang Gin 實戰(七)| 分組路由源代碼分析
- Golang Gin 實戰(八)| JSON渲染輸出
- Golang Gin 實戰(九)| JSONP跨域和劫持
- Golang Gin 實戰(十)| XML渲染
- Golang Gin 實戰(十一)| HTML模板渲染
- Golang Gin 實戰(十二)| ProtoBuf 使用和源碼分析原理實現
- Golang Gin 實戰(十三)| 中間件詳解看這一篇就夠了
- 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不存在的話,可以指定返回的默認值 |