GIN 读取HTTP参数
我们使用gin时,获取参数的方式,一般如下:
获取请求中的Query
r.GET("/user/search", func(c *gin.Context) {
username := c.DefaultQuery("username", "dapeng")
address := c.Query("address")
//...
})
获取form参数
r.POST("/user/search", func(c *gin.Context) {
username, ok := c.GetPostForm("username")
//...
})
获取json
//...
type Login struct {
User string `form:"user" json:"user" binding:"required"`
Password string `form:"password" json:"password" binding:"required"`
}
//...
r.POST("/loginJSON", func(c *gin.Context) {
var login Login
// 将请求中的JSON数据绑定到Login结构体
if err := c.ShouldBind(&login); err == nil {
//...
} else {
//...
}
})
怎样减少这些样板的代码的编写的呢?
如果可以这样读取query参数:
ctr.POST(
"/hello",
func(in struct {
yourName string `gone:"http,query=name"` //注册请求query中的name参数
name string `gone:"http,query"` //注册请求query中的name参数;不指定参数名,则取属性名作为参数名
age int `gone:"http,query=age"` //int类型
}) string {
return fmt.Sprintf("hello, %s, your name is %s", in.yourName, in.name)
},
)
这样读取json(xml或者form-data)请求:
type Req struct {
Page string `form:"page" json:"page,omitempty" xml:"page" binding:"required"`
PageSize string `form:"pageSize" json:"pageSize,omitempty" xml:"pageSize" binding:"required"`
Keywords []string `form:"keywords" json:"keywords,omitempty" xml:"keywords" binding:"required"`
}
ctr.rootRouter.
Group("/demo").
POST(
"/hello",
func(in struct {
req Req `gone:"http,body"`
}) string {
fmt.Println(in.req)
return fmt.Sprintf("hello, keywords is [%v]", in.req.Keywords)
},
)
会不会好一点呢?
这就是Gone框架的处理HTTP请求的方式,不仅支持 Query、JSON请求的注入,还支持:
- 请求头的注入
- Cookie的注入
- 请求上下文的注入
- 等等…
更多 HTTP请求注入方式,可以参考官方文档 HTTP 注入说明
Gone框架
Gone 是我们做了一个依赖注入框架,内置了gin做web服务,并且对其做了增强:
- 请求参数支持依赖注入
- 请求处理的Handle,返回的参数自动转为HTTP响应
另外,还集成 日志、配置、定时任务、分布式缓存、数据集、消息中间件等功能。
gone的项目地址:https://github.com/gone-io/gone
文档地址:https://goner.fun/zh/
另外,🔥添加交流群,赠送 Golang 多套 学习资料,夯实基础👍🏻👍🏻
下面是课程部分截图: