gin 模型绑定和验证
编辑于 2023-06-20 18:58:35 阅读 1035
缺点
无法设置默认值
比如需要分页的接口,页码和条数是非必传的,如果不传页码默认1,条数默认10,但是go-playground/validator/v10做不到
无法同时获取路径参数和(查询参数或正文参数)
restful风格的路由中会遇到这个问题,比如:有如下路由
r.GET("/:user_id/category/:category_id/article", myFunc)
请求如下
curl 'localhost:7097/v1/user/0/category/4/article?page=1&max=10'
我该如何用一个模型同时取到category_id
,page
,max
参数呢?做不到!
只能拆成两个模型,然后分别用ShouldBindUri
、ShouldBindQuery
获取
Bind和ShouldBind
Gin提供了两类绑定方法:
Type - Must bind
- Methods - Bind, BindJSON, BindXML, BindQuery, BindYAML
- Behavior - 这些方法属于
MustBindWith
的具体调用。 如果发生绑定错误,则请求终止,并触发c.AbortWithError(400, err).SetType(ErrorTypeBind)
。响应状态码被设置为 400 并且 Content-Type 被设置为text/plain; charset=utf-8
。 如果您在此之后尝试设置响应状态码,Gin会输出日志[GIN-debug] [WARNING] Headers were already written. Wanted to override status code 400 with 422
。 如果您希望更好地控制绑定,考虑使用ShouldBind
等效方法。
Type - Should bind
- Methods - ShouldBind, ShouldBindJSON, ShouldBindXML, ShouldBindQuery, ShouldBindYAML
- Behavior - 这些方法属于
ShouldBindWith
的具体调用。 如果发生绑定错误,Gin 会返回错误并由开发者处理错误和请求。 使用Bind
方法时,Gin 会尝试根据Content-Type
推断如何绑定。 如果你明确知道要绑定什么,可以使用MustBindWith
或ShouldBindWith
。
自定义验证器&转化中文
https://learnku.com/articles/59498#745bcc
参考
https://gin-gonic.com/zh-cn/docs/examples/binding-and-validation/