目录
 - 一:经典入门案例
 - 二:请求参数
 - 2.1: API参数
 - 2.2: URL参数
 - 2.3: 表单参数
 
 - 三: 响应参数
 - 四:数据解析和绑定
 - 4.1: JSON数据解析绑定
 - 4.2: FROM表单数据解析和绑定
 
 - 五: 路由组
 - 六:异步处理
 - 七:中间件
 -  
 
 
 
  
 
一:经典入门案例
 
 
二:请求参数
 
2.1: API参数
 
- API参数: 参数写在路径中。
 - 注意: 
- 1: 一般用冒号 + 路径参数名称来划分。 冒号的作用是可以让Param方法取到后面的数据。
 - 2: 如果是用星号 + 路径名称,则获取到的是包含路径斜杠+后续的所有内容的。
 
  - 案例一:
	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")}```
- 结果, 发送请求: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参数
 
- URL参数:参数写在请求k-v对中。
 - 使用Query()函数获取参数信息, 获取不到默认获取到空字符串。
 - 案例
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: 表单参数
 
- POST请求中的信息, 一般是JSON数据。
 - 使用PostForm函数在表单中获取数据。
 - 案例:
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数据
 - 案例:
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")
}
  - 结果
 
 
 
三: 响应参数
 
- Gin支持多种响应格式, 例如:json、结构体、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")
}
  - 结果:
 
 
 
四:数据解析和绑定
 
4.1: JSON数据解析绑定
 
 
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表单数据解析和绑定
 
- 表单只需要调整一下使用的方法: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")
}
  - 测试
 
 
 
 
五: 路由组
 
- 作用:根据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()})}
}
  - 测试
 
 
 
六:异步处理
 
- 需求:某些处理, 我们可以放在后台去做, 接口要求立刻返回数据。 则可以使用异步处理的方式。
 - 案例
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()})}
}
  - 结果, 先返回了响应, 后进行循环处理。
 
 
 
七:中间件
 
7.1: 全局中间件
 
- 所有的请求都经过的中间件。
 - 例如: 所有的请求都经过
 
 
7.2: 局部中间件