目录
- 一:经典入门案例
- 二:请求参数
- 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: 局部中间件