From 9b5fdcc0ac2c443879dcae6414f4b111f6a4c59b Mon Sep 17 00:00:00 2001 From: HF Date: Sat, 15 Jun 2024 09:00:17 -0400 Subject: [PATCH] Optimized the HTTP bind util with streaming style --- api/server/httputils/httputils.go | 69 ++++++++++++++++----- api/server/router/cluster/cluster_routes.go | 45 ++++++-------- api/server/router/cluster/helm_routes.go | 2 +- api/server/router/cluster/ws.go | 9 +-- api/server/router/plan/config_routes.go | 21 +++---- api/server/router/plan/node_routes.go | 23 +++---- api/server/router/plan/plan_routes.go | 36 ++++------- api/server/router/plan/task_routes.go | 2 +- api/server/router/proxy/proxy.go | 2 +- api/server/router/tenant/tenant_routes.go | 25 +++----- api/server/router/user/user_routes.go | 34 ++++------ 11 files changed, 129 insertions(+), 139 deletions(-) diff --git a/api/server/httputils/httputils.go b/api/server/httputils/httputils.go index 1510f99d..9e0fbc8a 100644 --- a/api/server/httputils/httputils.go +++ b/api/server/httputils/httputils.go @@ -106,24 +106,61 @@ func AbortFailedWithCode(c *gin.Context, code int, err error) { c.Abort() } -func ShouldBindAny(c *gin.Context, jsonObject interface{}, uriObject interface{}, queryObject interface{}) error { - var err error - if jsonObject != nil { - if err = c.ShouldBindJSON(jsonObject); err != nil { - return err - } - } - if uriObject != nil { - if err = c.ShouldBindUri(uriObject); err != nil { - return err - } +// func ShouldBindAny(c *gin.Context, jsonObject interface{}, uriObject interface{}, queryObject interface{}) error { +// var err error +// if jsonObject != nil { +// if err = c.ShouldBindJSON(jsonObject); err != nil { +// return err +// } +// } +// if uriObject != nil { +// if err = c.ShouldBindUri(uriObject); err != nil { +// return err +// } +// } +// if queryObject != nil { +// if err = c.ShouldBindQuery(queryObject); err != nil { +// return err +// } +// } +// return nil +// } + +type errBind struct { + ctx *gin.Context + err error +} + +func ShouldBind(c *gin.Context) *errBind { + return &errBind{ + ctx: c, } - if queryObject != nil { - if err = c.ShouldBindQuery(queryObject); err != nil { - return err - } +} + +func (b *errBind) doBind(obj interface{}, bind func(obj interface{}) error) { + if b.err != nil { + return } - return nil + b.err = bind(obj) +} + +func (b *errBind) WithBody(json interface{}) *errBind { + b.doBind(json, b.ctx.ShouldBindJSON) + return b +} + +func (b *errBind) WithUri(uri interface{}) *errBind { + b.doBind(uri, b.ctx.ShouldBindUri) + return b +} + +func (b *errBind) WithQuery(query interface{}) *errBind { + b.doBind(query, b.ctx.ShouldBindQuery) + return b +} + +func (b *errBind) Error() error { + return b.err } func GetUserIdFromRequest(ctx context.Context) (int64, error) { diff --git a/api/server/router/cluster/cluster_routes.go b/api/server/router/cluster/cluster_routes.go index 576051f0..cc105bd6 100644 --- a/api/server/router/cluster/cluster_routes.go +++ b/api/server/router/cluster/cluster_routes.go @@ -45,7 +45,8 @@ func (cr *clusterRouter) createCluster(c *gin.Context) { r := httputils.NewResponse() var req types.CreateClusterRequest - if err := c.ShouldBindJSON(&req); err != nil { + + if err := httputils.ShouldBind(c).WithBody(&req).Error(); err != nil { httputils.SetFailed(c, r, err) return } @@ -76,20 +77,15 @@ func (cr *clusterRouter) updateCluster(c *gin.Context) { r := httputils.NewResponse() var ( idMeta IdMeta - err error + req types.UpdateClusterRequest ) - if err = c.ShouldBindUri(&idMeta); err != nil { - httputils.SetFailed(c, r, err) - return - } - var req types.UpdateClusterRequest - if err = c.ShouldBindJSON(&req); err != nil { + if err := httputils.ShouldBind(c).WithUri(&idMeta).WithBody(&req).Error(); err != nil { httputils.SetFailed(c, r, err) return } - if err = cr.c.Cluster().Update(c, idMeta.ClusterId, &req); err != nil { + if err := cr.c.Cluster().Update(c, idMeta.ClusterId, &req); err != nil { httputils.SetFailed(c, r, err) return } @@ -114,16 +110,13 @@ func (cr *clusterRouter) updateCluster(c *gin.Context) { func (cr *clusterRouter) deleteCluster(c *gin.Context) { r := httputils.NewResponse() - var ( - idMeta IdMeta - err error - ) - if err = c.ShouldBindUri(&idMeta); err != nil { + var idMeta IdMeta + if err := httputils.ShouldBind(c).WithUri(&idMeta).Error(); err != nil { httputils.SetFailed(c, r, err) return } - if err = cr.c.Cluster().Delete(c, idMeta.ClusterId); err != nil { + if err := cr.c.Cluster().Delete(c, idMeta.ClusterId); err != nil { httputils.SetFailed(c, r, err) return } @@ -151,7 +144,7 @@ func (cr *clusterRouter) getCluster(c *gin.Context) { idMeta IdMeta err error ) - if err = c.ShouldBindUri(&idMeta); err != nil { + if err = httputils.ShouldBind(c).WithUri(&idMeta).Error(); err != nil { httputils.SetFailed(c, r, err) return } @@ -206,15 +199,12 @@ func (cr *clusterRouter) listClusters(c *gin.Context) { func (cr *clusterRouter) pingCluster(c *gin.Context) { r := httputils.NewResponse() - var ( - cluster types.Cluster - err error - ) - if err = c.ShouldBindJSON(&cluster); err != nil { + var cluster types.Cluster + if err := httputils.ShouldBind(c).WithBody(&cluster).Error(); err != nil { httputils.SetFailed(c, r, err) return } - if err = cr.c.Cluster().Ping(c, cluster.KubeConfig); err != nil { + if err := cr.c.Cluster().Ping(c, cluster.KubeConfig); err != nil { httputils.SetFailed(c, r, err) return } @@ -227,13 +217,14 @@ func (cr *clusterRouter) protectCluster(c *gin.Context) { var ( idMeta IdMeta req types.ProtectClusterRequest - err error ) - if err = httputils.ShouldBindAny(c, &req, &idMeta, nil); err != nil { + + if err := httputils.ShouldBind(c).WithBody(&req).WithUri(&idMeta).Error(); err != nil { httputils.SetFailed(c, r, err) return } - if err = cr.c.Cluster().Protect(c, idMeta.ClusterId, &req); err != nil { + + if err := cr.c.Cluster().Protect(c, idMeta.ClusterId, &req); err != nil { httputils.SetFailed(c, r, err) return } @@ -253,7 +244,7 @@ func (cr *clusterRouter) aggregateEvents(c *gin.Context) { err error ) - if err = c.ShouldBindUri(&optMeta); err != nil { + if err = httputils.ShouldBind(c).WithUri(&optMeta).Error(); err != nil { httputils.SetFailed(c, r, err) return } @@ -274,7 +265,7 @@ func (cr *clusterRouter) getEventList(c *gin.Context) { eventOpt types.EventOptions err error ) - if err = httputils.ShouldBindAny(c, nil, &opts, &eventOpt); err != nil { + if err = httputils.ShouldBind(c).WithUri(&opts).WithQuery(&eventOpt).Error(); err != nil { httputils.SetFailed(c, r, err) return } diff --git a/api/server/router/cluster/helm_routes.go b/api/server/router/cluster/helm_routes.go index 2cb5db63..84396b23 100644 --- a/api/server/router/cluster/helm_routes.go +++ b/api/server/router/cluster/helm_routes.go @@ -34,7 +34,7 @@ func (cr *clusterRouter) ListReleases(c *gin.Context) { err error helmMeta HelmMeta ) - if err = c.ShouldBindUri(&helmMeta); err != nil { + if err = httputils.ShouldBind(c).WithUri(&helmMeta).Error(); err != nil { httputils.SetFailed(c, r, err) return } diff --git a/api/server/router/cluster/ws.go b/api/server/router/cluster/ws.go index f66755d4..2c983491 100644 --- a/api/server/router/cluster/ws.go +++ b/api/server/router/cluster/ws.go @@ -25,15 +25,12 @@ import ( func (cr *clusterRouter) webShell(c *gin.Context) { r := httputils.NewResponse() - var ( - err error - opt types.WebShellOptions - ) - if err = c.ShouldBindQuery(&opt); err != nil { + var opt types.WebShellOptions + if err := httputils.ShouldBind(c).WithQuery(&opt).Error(); err != nil { httputils.SetFailed(c, r, err) return } - if err = cr.c.Cluster().WsHandler(c, &opt, c.Writer, c.Request); err != nil { + if err := cr.c.Cluster().WsHandler(c, &opt, c.Writer, c.Request); err != nil { httputils.SetFailed(c, r, err) return } diff --git a/api/server/router/plan/config_routes.go b/api/server/router/plan/config_routes.go index 242c9e88..6dc145f5 100644 --- a/api/server/router/plan/config_routes.go +++ b/api/server/router/plan/config_routes.go @@ -35,13 +35,12 @@ func (t *planRouter) createPlanConfig(c *gin.Context) { var ( opt planMeta req types.CreatePlanConfigRequest - err error ) - if err = httputils.ShouldBindAny(c, &req, &opt, nil); err != nil { + if err := httputils.ShouldBind(c).WithUri(&opt).WithBody(&req).Error(); err != nil { httputils.SetFailed(c, r, err) return } - if err = t.c.Plan().CreateConfig(c, opt.PlanId, &req); err != nil { + if err := t.c.Plan().CreateConfig(c, opt.PlanId, &req); err != nil { httputils.SetFailed(c, r, err) return } @@ -55,13 +54,12 @@ func (t *planRouter) updatePlanConfig(c *gin.Context) { var ( opt planConfigMeta req types.UpdatePlanConfigRequest - err error ) - if err = httputils.ShouldBindAny(c, &req, &opt, nil); err != nil { + if err := httputils.ShouldBind(c).WithUri(&opt).WithBody(&req).Error(); err != nil { httputils.SetFailed(c, r, err) return } - if err = t.c.Plan().UpdateConfig(c, opt.PlanId, opt.ConfigId, &req); err != nil { + if err := t.c.Plan().UpdateConfig(c, opt.PlanId, opt.ConfigId, &req); err != nil { httputils.SetFailed(c, r, err) return } @@ -72,15 +70,12 @@ func (t *planRouter) updatePlanConfig(c *gin.Context) { func (t *planRouter) deletePlanConfig(c *gin.Context) { r := httputils.NewResponse() - var ( - opt planConfigMeta - err error - ) - if err = httputils.ShouldBindAny(c, nil, &opt, nil); err != nil { + var opt planConfigMeta + if err := httputils.ShouldBind(c).WithUri(&opt).Error(); err != nil { httputils.SetFailed(c, r, err) return } - if err = t.c.Plan().DeleteConfig(c, opt.PlanId, opt.ConfigId); err != nil { + if err := t.c.Plan().DeleteConfig(c, opt.PlanId, opt.ConfigId); err != nil { httputils.SetFailed(c, r, err) return } @@ -95,7 +90,7 @@ func (t *planRouter) getPlanConfig(c *gin.Context) { opt planMeta err error ) - if err = httputils.ShouldBindAny(c, nil, &opt, nil); err != nil { + if err = httputils.ShouldBind(c).WithUri(&opt).Error(); err != nil { httputils.SetFailed(c, r, err) return } diff --git a/api/server/router/plan/node_routes.go b/api/server/router/plan/node_routes.go index 127ca805..3ed40776 100644 --- a/api/server/router/plan/node_routes.go +++ b/api/server/router/plan/node_routes.go @@ -35,13 +35,12 @@ func (t *planRouter) createPlanNode(c *gin.Context) { var ( opt planMeta req types.CreatePlanNodeRequest - err error ) - if err = httputils.ShouldBindAny(c, &req, &opt, nil); err != nil { + if err := httputils.ShouldBind(c).WithUri(&opt).WithBody(&req).Error(); err != nil { httputils.SetFailed(c, r, err) return } - if err = t.c.Plan().CreateNode(c, opt.PlanId, &req); err != nil { + if err := t.c.Plan().CreateNode(c, opt.PlanId, &req); err != nil { httputils.SetFailed(c, r, err) return } @@ -55,13 +54,12 @@ func (t *planRouter) updatePlanNode(c *gin.Context) { var ( opt planNodeMeta req types.UpdatePlanNodeRequest - err error ) - if err = httputils.ShouldBindAny(c, &req, &opt, nil); err != nil { + if err := httputils.ShouldBind(c).WithUri(&opt).WithBody(&req).Error(); err != nil { httputils.SetFailed(c, r, err) return } - if err = t.c.Plan().UpdateNode(c, opt.PlanId, opt.NodeId, &req); err != nil { + if err := t.c.Plan().UpdateNode(c, opt.PlanId, opt.NodeId, &req); err != nil { httputils.SetFailed(c, r, err) return } @@ -72,15 +70,12 @@ func (t *planRouter) updatePlanNode(c *gin.Context) { func (t *planRouter) deletePlanNode(c *gin.Context) { r := httputils.NewResponse() - var ( - opt planNodeMeta - err error - ) - if err = httputils.ShouldBindAny(c, nil, &opt, nil); err != nil { + var opt planNodeMeta + if err := httputils.ShouldBind(c).WithUri(&opt).Error(); err != nil { httputils.SetFailed(c, r, err) return } - if err = t.c.Plan().DeleteNode(c, opt.PlanId, opt.NodeId); err != nil { + if err := t.c.Plan().DeleteNode(c, opt.PlanId, opt.NodeId); err != nil { httputils.SetFailed(c, r, err) return } @@ -95,7 +90,7 @@ func (t *planRouter) getPlanNode(c *gin.Context) { opt planNodeMeta err error ) - if err = httputils.ShouldBindAny(c, nil, &opt, nil); err != nil { + if err = httputils.ShouldBind(c).WithUri(&opt).Error(); err != nil { httputils.SetFailed(c, r, err) return } @@ -114,7 +109,7 @@ func (t *planRouter) listPlanNodes(c *gin.Context) { opt planMeta err error ) - if err = httputils.ShouldBindAny(c, nil, &opt, nil); err != nil { + if err = httputils.ShouldBind(c).WithUri(&opt).Error(); err != nil { httputils.SetFailed(c, r, err) return } diff --git a/api/server/router/plan/plan_routes.go b/api/server/router/plan/plan_routes.go index c1eddca5..c805addd 100644 --- a/api/server/router/plan/plan_routes.go +++ b/api/server/router/plan/plan_routes.go @@ -31,7 +31,7 @@ func (t *planRouter) createPlan(c *gin.Context) { r := httputils.NewResponse() var req types.CreatePlanRequest - if err := c.ShouldBindJSON(&req); err != nil { + if err := httputils.ShouldBind(c).WithBody(&req).Error(); err != nil { httputils.SetFailed(c, r, err) return } @@ -49,13 +49,12 @@ func (t *planRouter) updatePlan(c *gin.Context) { var ( opt planMeta req types.UpdatePlanRequest - err error ) - if err = httputils.ShouldBindAny(c, &req, &opt, nil); err != nil { + if err := httputils.ShouldBind(c).WithUri(&opt).WithBody(&req).Error(); err != nil { httputils.SetFailed(c, r, err) return } - if err = t.c.Plan().Update(c, opt.PlanId, &req); err != nil { + if err := t.c.Plan().Update(c, opt.PlanId, &req); err != nil { httputils.SetFailed(c, r, err) return } @@ -66,15 +65,12 @@ func (t *planRouter) updatePlan(c *gin.Context) { func (t *planRouter) deletePlan(c *gin.Context) { r := httputils.NewResponse() - var ( - opt planMeta - err error - ) - if err = c.ShouldBindUri(&opt); err != nil { + var opt planMeta + if err := httputils.ShouldBind(c).WithUri(&opt).Error(); err != nil { httputils.SetFailed(c, r, err) return } - if err = t.c.Plan().Delete(c, opt.PlanId); err != nil { + if err := t.c.Plan().Delete(c, opt.PlanId); err != nil { httputils.SetFailed(c, r, err) return } @@ -89,7 +85,7 @@ func (t *planRouter) getPlan(c *gin.Context) { opt planMeta err error ) - if err = c.ShouldBindUri(&opt); err != nil { + if err = httputils.ShouldBind(c).WithUri(&opt).Error(); err != nil { httputils.SetFailed(c, r, err) return } @@ -116,15 +112,12 @@ func (t *planRouter) listPlans(c *gin.Context) { func (t *planRouter) startPlan(c *gin.Context) { r := httputils.NewResponse() - var ( - opt planMeta - err error - ) - if err = c.ShouldBindUri(&opt); err != nil { + var opt planMeta + if err := httputils.ShouldBind(c).WithUri(&opt).Error(); err != nil { httputils.SetFailed(c, r, err) return } - if err = t.c.Plan().Start(c, opt.PlanId); err != nil { + if err := t.c.Plan().Start(c, opt.PlanId); err != nil { httputils.SetFailed(c, r, err) return } @@ -135,15 +128,12 @@ func (t *planRouter) startPlan(c *gin.Context) { func (t *planRouter) stopPlan(c *gin.Context) { r := httputils.NewResponse() - var ( - opt planMeta - err error - ) - if err = c.ShouldBindUri(&opt); err != nil { + var opt planMeta + if err := httputils.ShouldBind(c).WithUri(&opt).Error(); err != nil { httputils.SetFailed(c, r, err) return } - if err = t.c.Plan().Stop(c, opt.PlanId); err != nil { + if err := t.c.Plan().Stop(c, opt.PlanId); err != nil { httputils.SetFailed(c, r, err) return } diff --git a/api/server/router/plan/task_routes.go b/api/server/router/plan/task_routes.go index cf04e5f3..179112cf 100644 --- a/api/server/router/plan/task_routes.go +++ b/api/server/router/plan/task_routes.go @@ -41,7 +41,7 @@ func (t *planRouter) listTasks(c *gin.Context) { opt planMeta err error ) - if err = httputils.ShouldBindAny(c, nil, &opt, nil); err != nil { + if err = httputils.ShouldBind(c).WithUri(&opt).Error(); err != nil { httputils.SetFailed(c, r, err) return } diff --git a/api/server/router/proxy/proxy.go b/api/server/router/proxy/proxy.go index cc43cc90..af5070d5 100644 --- a/api/server/router/proxy/proxy.go +++ b/api/server/router/proxy/proxy.go @@ -58,7 +58,7 @@ func (p *proxyRouter) proxyHandler(c *gin.Context) { var cluster struct { Name string `uri:"clusterName" binding:"required"` } - if err := c.ShouldBindUri(&cluster); err != nil { + if err := httputils.ShouldBind(c).WithUri(&cluster).Error(); err != nil { httputils.SetFailed(c, resp, err) return } diff --git a/api/server/router/tenant/tenant_routes.go b/api/server/router/tenant/tenant_routes.go index ec50dc3e..b2b05aa6 100644 --- a/api/server/router/tenant/tenant_routes.go +++ b/api/server/router/tenant/tenant_routes.go @@ -31,7 +31,7 @@ func (t *tenantRouter) createTenant(c *gin.Context) { r := httputils.NewResponse() var req types.CreateTenantRequest - if err := c.ShouldBindJSON(&req); err != nil { + if err := httputils.ShouldBind(c).WithBody(&req).Error(); err != nil { httputils.SetFailed(c, r, err) return } @@ -48,18 +48,13 @@ func (t *tenantRouter) updateTenant(c *gin.Context) { var ( opt TenantMeta - err error + req types.UpdateTenantRequest ) - if err = c.ShouldBindUri(&opt); err != nil { + if err := httputils.ShouldBind(c).WithUri(&opt).WithBody(&req).Error(); err != nil { httputils.SetFailed(c, r, err) return } - var req types.UpdateTenantRequest - if err = c.ShouldBindJSON(&req); err != nil { - httputils.SetFailed(c, r, err) - return - } - if err = t.c.Tenant().Update(c, opt.TenantId, &req); err != nil { + if err := t.c.Tenant().Update(c, opt.TenantId, &req); err != nil { httputils.SetFailed(c, r, err) return } @@ -70,15 +65,13 @@ func (t *tenantRouter) updateTenant(c *gin.Context) { func (t *tenantRouter) deleteTenant(c *gin.Context) { r := httputils.NewResponse() - var ( - opt TenantMeta - err error - ) - if err = c.ShouldBindUri(&opt); err != nil { + var opt TenantMeta + if err := httputils.ShouldBind(c).WithUri(&opt).Error(); err != nil { httputils.SetFailed(c, r, err) return } - if err = t.c.Tenant().Delete(c, opt.TenantId); err != nil { + + if err := t.c.Tenant().Delete(c, opt.TenantId); err != nil { httputils.SetFailed(c, r, err) return } @@ -93,7 +86,7 @@ func (t *tenantRouter) getTenant(c *gin.Context) { opt TenantMeta err error ) - if err = c.ShouldBindUri(&opt); err != nil { + if err = httputils.ShouldBind(c).WithUri(&opt).Error(); err != nil { httputils.SetFailed(c, r, err) return } diff --git a/api/server/router/user/user_routes.go b/api/server/router/user/user_routes.go index 1b7be027..61db5835 100644 --- a/api/server/router/user/user_routes.go +++ b/api/server/router/user/user_routes.go @@ -44,15 +44,12 @@ type IdMeta struct { func (u *userRouter) createUser(c *gin.Context) { r := httputils.NewResponse() - var ( - req types.CreateUserRequest - err error - ) - if err = c.ShouldBindJSON(&req); err != nil { + var req types.CreateUserRequest + if err := httputils.ShouldBind(c).WithBody(&req).Error(); err != nil { httputils.SetFailed(c, r, err) return } - if err = u.c.User().Create(c, &req); err != nil { + if err := u.c.User().Create(c, &req); err != nil { httputils.SetFailed(c, r, err) return } @@ -81,13 +78,12 @@ func (u *userRouter) updateUser(c *gin.Context) { var ( idMeta IdMeta req types.UpdateUserRequest - err error ) - if err = httputils.ShouldBindAny(c, &req, &idMeta, nil); err != nil { + if err := httputils.ShouldBind(c).WithUri(&idMeta).WithBody(&req).Error(); err != nil { httputils.SetFailed(c, r, err) return } - if err = u.c.User().Update(c, idMeta.UserId, &req); err != nil { + if err := u.c.User().Update(c, idMeta.UserId, &req); err != nil { httputils.SetFailed(c, r, err) return } @@ -116,13 +112,12 @@ func (u *userRouter) updatePassword(c *gin.Context) { var ( idMeta IdMeta req types.UpdateUserPasswordRequest - err error ) - if err = httputils.ShouldBindAny(c, &req, &idMeta, nil); err != nil { + if err := httputils.ShouldBind(c).WithUri(&idMeta).WithBody(&req).Error(); err != nil { httputils.SetFailed(c, r, err) return } - if err = u.c.User().UpdatePassword(c, idMeta.UserId, &req); err != nil { + if err := u.c.User().UpdatePassword(c, idMeta.UserId, &req); err != nil { httputils.SetFailed(c, r, err) return } @@ -147,15 +142,12 @@ func (u *userRouter) updatePassword(c *gin.Context) { func (u *userRouter) deleteUser(c *gin.Context) { r := httputils.NewResponse() - var ( - idMeta IdMeta - err error - ) - if err = c.ShouldBindUri(&idMeta); err != nil { + var idMeta IdMeta + if err := httputils.ShouldBind(c).WithUri(&idMeta).Error(); err != nil { httputils.SetFailed(c, r, err) return } - if err = u.c.User().Delete(c, idMeta.UserId); err != nil { + if err := u.c.User().Delete(c, idMeta.UserId); err != nil { httputils.SetFailed(c, r, err) return } @@ -184,7 +176,7 @@ func (u *userRouter) getUser(c *gin.Context) { idMeta IdMeta err error ) - if err = c.ShouldBindUri(&idMeta); err != nil { + if err = httputils.ShouldBind(c).WithUri(&idMeta).Error(); err != nil { httputils.SetFailed(c, r, err) return } @@ -215,7 +207,7 @@ func (u *userRouter) listUsers(c *gin.Context) { opts types.ListOptions err error ) - if err = httputils.ShouldBindAny(c, nil, nil, &opts); err != nil { + if err = httputils.ShouldBind(c).WithQuery(&opts).Error(); err != nil { httputils.SetFailed(c, r, err) return } @@ -252,7 +244,7 @@ func (u *userRouter) login(c *gin.Context) { req types.LoginRequest err error ) - if err = c.ShouldBindJSON(&req); err != nil { + if err = httputils.ShouldBind(c).WithBody(&req).Error(); err != nil { httputils.SetFailed(c, r, err) return }