竹简文档

请求绑定

Bind(...).Data / Query / URI / Header 的统一绑定与校验

请求绑定

xUtil 通过统一入口 Bind 提供 4 种绑定方法,分别覆盖请求体、查询参数、路径参数与请求头。

import xUtil "github.com/bamboo-services/bamboo-base-go/common/utility"

统一行为

四种绑定方法都遵循同一套行为:

  • 绑定成功:返回传入的 data 指针。
  • 绑定失败:调用 xVaild.HandleValidationError(ctx, err),执行 ctx.Abort(),并返回 nil
  • 调用方拿到 nil 时,应立即 return,避免重复写响应。

API 结构

binding.go
func Bind[T any](ctx *gin.Context, data *T) *pack.Binding[T]

func (u *Binding[T]) Data() *T
func (u *Binding[T]) Query() *T
func (u *Binding[T]) URI() *T
func (u *Binding[T]) Header() *T

使用示例

1) JSON 请求体:Data

handler/user.go
type CreateUserRequest struct {
    Username string `json:"username" binding:"required,min=3,max=32"`
    Email    string `json:"email" binding:"required,email"`
    Password string `json:"password" binding:"required,min=8"`
}

func CreateUser(ctx *gin.Context) {
    req := xUtil.Bind(ctx, &CreateUserRequest{}).Data()
    if req == nil {
        return
    }

    // req 已完成绑定和校验
    xResult.Success(ctx, "创建成功")
}

2) Query 参数:Query

type ListUserQuery struct {
    Page int64 `form:"page" binding:"omitempty,min=1"`
    Size int64 `form:"size" binding:"omitempty,min=1,max=200"`
}

func ListUsers(ctx *gin.Context) {
    query := xUtil.Bind(ctx, &ListUserQuery{}).Query()
    if query == nil {
        return
    }

    xResult.SuccessHasData(ctx, "查询成功", query)
}

3) URI 参数:URI

type UserURI struct {
    UserID int64 `uri:"user_id" binding:"required,min=1"`
}

func GetUser(ctx *gin.Context) {
    uri := xUtil.Bind(ctx, &UserURI{}).URI()
    if uri == nil {
        return
    }

    xResult.SuccessHasData(ctx, "查询成功", gin.H{"user_id": uri.UserID})
}

4) Header 参数:Header

type TraceHeader struct {
    RequestID string `header:"X-Request-UUID" binding:"required"`
}

func GetProfile(ctx *gin.Context) {
    header := xUtil.Bind(ctx, &TraceHeader{}).Header()
    if header == nil {
        return
    }

    xResult.SuccessHasData(ctx, "ok", gin.H{"request_id": header.RequestID})
}

与手动绑定对比(以 Query 为例)

手动写法:

var query ListUserQuery
if err := ctx.ShouldBindQuery(&query); err != nil {
    xVaild.HandleValidationError(ctx, err)
    ctx.Abort()
    return
}

使用 Bind(...).Query()

query := xUtil.Bind(ctx, &ListUserQuery{}).Query()
if query == nil {
    return
}

注意事项

  • Data 使用 JSON 绑定,适用于请求体场景。
  • Query / URI / Header 分别用于 query、路径参数与 header。
  • 返回 nil 代表请求已被中止,调用方应立即 return
  • 需要完全自定义错误处理时,可保留手动绑定流程。

下一步

On this page