gin 模型绑定和验证

编辑于 2023-06-20 10:58:35 阅读 435

缺点

无法设置默认值

比如需要分页的接口,页码和条数是非必传的,如果不传页码默认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_idpagemax参数呢?做不到! 只能拆成两个模型,然后分别用ShouldBindUriShouldBindQuery获取

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 推断如何绑定。 如果你明确知道要绑定什么,可以使用 MustBindWithShouldBindWith

自定义验证器&转化中文

https://learnku.com/articles/59498#745bcc

参考

https://gin-gonic.com/zh-cn/docs/examples/binding-and-validation/

广而告之,我的新作品《语音助手》上架Google Play了,欢迎下载体验