目錄
- 一:經(jīng)典入門案例
- 二:請求參數(shù)
- 2.1: API參數(shù)
- 2.2: URL參數(shù)
- 2.3: 表單參數(shù)
- 三: 響應(yīng)參數(shù)
- 四:數(shù)據(jù)解析和綁定
- 4.1: JSON數(shù)據(jù)解析綁定
- 4.2: FROM表單數(shù)據(jù)解析和綁定
- 五: 路由組
- 六:異步處理
- 七:中間件
-
一:經(jīng)典入門案例
二:請求參數(shù)
2.1: API參數(shù)
- API參數(shù): 參數(shù)寫在路徑中。
- 注意:
- 1: 一般用冒號 + 路徑參數(shù)名稱來劃分。 冒號的作用是可以讓Param方法取到后面的數(shù)據(jù)。
- 2: 如果是用星號 + 路徑名稱,則獲取到的是包含路徑斜杠+后續(xù)的所有內(nèi)容的。
- 案例一:
package mainimport ("github.com/gin-gonic/gin""net/http")func main() {r := gin.Default()r.GET("/user/:name/:action", func(context *gin.Context) {name := context.Param("name")action := context.Param("action")context.String(http.StatusOK, "name is "+name+", action is "+action+"。")})r.Run(":8080")}```
- 結(jié)果, 發(fā)送請求:http://127.0.0.1:8080/user/renshanwen/reading

- 案例二:
package mainimport ("github.com/gin-gonic/gin""net/http"
)func main() {r := gin.Default()r.GET("/user/*name_action", func(context *gin.Context) {nameAction := context.Param("name_action")context.String(http.StatusOK, "name_action is "+nameAction)})r.Run(":8080")
}

2.2: URL參數(shù)
- URL參數(shù):參數(shù)寫在請求k-v對中。
- 使用Query()函數(shù)獲取參數(shù)信息, 獲取不到默認(rèn)獲取到空字符串。
- 案例
package mainimport ("github.com/gin-gonic/gin""net/http"
)func main() {r := gin.Default()r.GET("/user", func(context *gin.Context) {name := context.Query("name")age := context.Query("age")context.String(http.StatusOK, "name is "+name+" age is "+age+".")})r.Run(":8080")
}

2.3: 表單參數(shù)
- POST請求中的信息, 一般是JSON數(shù)據(jù)。
- 使用PostForm函數(shù)在表單中獲取數(shù)據(jù)。
- 案例:
package mainimport ("github.com/gin-gonic/gin""net/http"
)func main() {r := gin.Default()r.POST("/user", func(context *gin.Context) {name := context.PostForm("name")age := context.PostForm("age")context.String(http.StatusOK, "name is "+name+" age is "+age+".")})r.Run(":8080")
}

- 解析JSON數(shù)據(jù)
- 案例:
package mainimport ("github.com/gin-gonic/gin""net/http""strconv"
)func main() {r := gin.Default()type User struct {Name string `json:"name"`Age int64 `json:"age"`}r.POST("/user", func(context *gin.Context) {reqData := User{}context.BindJSON(&reqData)context.String(http.StatusOK, "name is "+reqData.Name+" age is "+strconv.FormatInt(reqData.Age, 10)+".")})r.Run(":8080")
}
- 結(jié)果

三: 響應(yīng)參數(shù)
- Gin支持多種響應(yīng)格式, 例如:json、結(jié)構(gòu)體、XML、YAML類似于java的properties、ProtoBuf。
- 最常用的就是json。
- 案例:
package mainimport ("github.com/gin-gonic/gin""net/http"
)func main() {r := gin.Default()type User struct {Name string `json:"name"`Age int64 `json:"age"`}r.POST("/user", func(context *gin.Context) {reqData := User{}context.BindJSON(&reqData)respData := gin.H{"name": "renshanwen","age": 25,}context.JSON(http.StatusOK, respData)})r.Run(":8080")
}
- 結(jié)果:

四:數(shù)據(jù)解析和綁定
4.1: JSON數(shù)據(jù)解析綁定
package mainimport ("github.com/gin-gonic/gin""net/http"
)func main() {r := gin.Default()type User struct {Name string `json:"name" binding:"required"`Age int64 `json:"age"`}r.POST("/user", func(context *gin.Context) {reqData := User{}if err := context.BindJSON(&reqData); err == nil {respData := gin.H{"name": "renshanwen","age": 25,}context.JSON(http.StatusOK, respData)} else {context.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})}})r.Run(":8080")
}
- 缺失name測試

- 缺失age測試

4.2: FROM表單數(shù)據(jù)解析和綁定
- 表單只需要調(diào)整一下使用的方法:Bind和定義的類型form
package mainimport ("github.com/gin-gonic/gin""net/http"
)func main() {r := gin.Default()type User struct {Name string `form:"name" binding:"required"`Age int64 `form:"age"`}r.POST("/user", func(context *gin.Context) {reqData := User{}if err := context.Bind(&reqData); err == nil {respData := gin.H{"name": "renshanwen","age": 25,}context.JSON(http.StatusOK, respData)} else {context.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})}})r.Run(":8080")
}
- 測試


五: 路由組
- 作用:根據(jù)URL前綴可以分組。
- 案例:
package mainimport ("github.com/gin-gonic/gin""net/http"
)
type User struct {Name string `form:"name" binding:"required"`Age int64 `form:"age"`
}func main() {r := gin.Default()userRoutes := r.Group("/user"){userRoutes.POST("/shan", test)userRoutes.POST("/wen", test)}r.Run(":8080")
}func test(context *gin.Context) {reqData := User{}if err := context.Bind(&reqData); err == nil {respData := gin.H{"name": "renshanwen","age": 25,}context.JSON(http.StatusOK, respData)} else {context.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})}
}
- 測試

六:異步處理
- 需求:某些處理, 我們可以放在后臺去做, 接口要求立刻返回數(shù)據(jù)。 則可以使用異步處理的方式。
- 案例
package mainimport ("fmt""github.com/gin-gonic/gin""net/http""time"
)
type User struct {Name string `form:"name" binding:"required"`Age int64 `form:"age"`
}func main() {r := gin.Default()userRoutes := r.Group("/user"){userRoutes.POST("/action", test)}r.Run(":8080")
}func test(context *gin.Context) {reqData := User{}if err := context.Bind(&reqData); err == nil {respData := gin.H{"name": "renshanwen","age": 25,}go func() {for i := 0; i < 10; i++ {fmt.Printf("正在處理 %d \n", i)time.Sleep(3 * time.Second)}}()context.JSON(http.StatusOK, respData)} else {context.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})}
}
- 結(jié)果, 先返回了響應(yīng), 后進(jìn)行循環(huán)處理。

七:中間件
7.1: 全局中間件
- 所有的請求都經(jīng)過的中間件。
- 例如: 所有的請求都經(jīng)過
7.2: 局部中間件