最简单的gin例子莫过于
//获得一个缺省的全局路由
router := gin.Default()
router.GET("/someGet", getting)
router.POST("/somePost", posting)
router.PUT("/somePut", putting)
router.DELETE("/someDelete", deleting)
router.PATCH("/somePatch", patching)
router.HEAD("/someHead", head)
router.OPTIONS("/someOptions", options)
//
router.Run()
其中方法第二个参数为
func (c *gin.Content)
绑定
url路径参数绑定
1.”/user/:name
这种方式匹配路径 /user/xxx的一个参数xxx(类似spring 的{id}),不会匹配到 /user 和/user/
这种方式会匹配到/user/xxx,所以像/user/haha /user/haha/xixix之类的路径不能再定义了
可以定义多个pathvalue /user/:name/:password
获取方式为content.Parm("name")
.
-
/user/:name/*action
‘*‘表示name之后的全部作为一个参数 映射到action
url查询绑定
url格式一般为/user?a=x&b=x
获取方法为
c.DefaultQuery("firstname", "Guest")
c.Query("lastname")
表单绑定
- 单个form参数获取
name := c.PostForm("name")
message := c.PostForm("message")
- map格式表单获取
ids := c.QueryMap("ids")
names := c.PostFormMap("names")
文件上传
xxx
路由
- 分组路由
v1 := router.Group("/v1")
{
v1.GET()
v1.POST()
}
定制自己的框架
首先
r :=gin.New()
然后像其中添加组件,比如```r.use(gin.Logger())``
还可添加自定义组件
r.use(gin.CustomRecovery(func(c *gin.Context, recovered interface{}) {
if err, ok := recovered.(string); ok {
c.String(http.StatusInternalServerError, fmt.Sprintf("error: %s", err))
}
c.AbortWithStatus(http.StatusInternalServerError)
}))
上述是官方提供的宕机恢复组件示例.
modle绑定
gin支持从json,xml,yaml,以及查询参数来进行模型绑定(model bindding).需要在model的字段加上相应的tag才行。比如从json中绑定,json:"fieldname"
方法
gin提供了两类方法
1.必须绑定
这类绑定会认为model需要绑定的字段如果没有绑定上,就会出错,所以会终止请求返回400错误信息(自动写入header).
主要包括
Bind,BindJSON,BindXML,,BindQueryBindYAMLBindHeader
2.should方法
与上述方法相反,这类方法在绑定参数失败后会返回错误给开发人员处理。
3.bind
这个方法会根据header中的字段推测应该绑定的类型,如果不确定可以使用这个方法
一个model例子
type Login struct {
User string `form:"user" json:"user" xml:"user" binding:"required"`
Password string `form:"password" json:"password" xml:"password" binding:"required"`
}
绑定请求头参数
type testHeader struct {
Rate int `header:"Rate"`
Domain string `header:"Domain"`
}
if err := c.ShouldBindHeader(&h); err != nil {
c.JSON(200, err)
}
返回
json
1.c.JSON(http.StatusOK, msg)
最简单的方法,直接传入struct即可
类似可返回xml,yaml不过方式变为
c.YAML(http.StatusOK, gin.H{"message": "hey", "status": http.StatusOK})
2.SecureJSON(http.StatusOK, names)
names := []string{"lena", "austin", "foo"}
// Will output : while(1);["lena","austin","foo"]
c.SecureJSON(http.StatusOK, names)
默认前缀为while(1),r.SecureJsonPrefix(),可更改.
类似还有ascalljosn,purejson等。
网友评论