我对Gin中的默认绑定有问题.我有一个传入的请求,其中主体是多个实体对象,如下所示:

<Entity>
  <Name>Name One here</Name>
  ...
</Entity>
<Entity>
  <Name>Name Two here</Name>
  ...
</Entity>

我的目标是将其映射到相应的切片.因此,所需对象的 struct 如下所示:

type Entity struct {
  XMLName xml.Name `bson:"-" json:"-" xml:"Entity"`
  Name   string    `bson:"name,omitempty" json:",omitempty" xml:",omitempty"`
  ...
}

我遇到的问题是,无论请求正文中传递了多少对象,都会将only one个提供的对象映射到片中.请注意,请求的JSON版本可以正确解析.

[
 {
   Name: "Name One",
   ...
 },
 {
   Name: "Name Two",
   ...
 }
]

我有一个用于对请求 struct 建模的 struct

type ApplicationRequest struct {
  XMLName      xml.Name `bson:"-" xml:"Entities"`
  Entities     []Entity `binding:"required" xml:"Entity"`
  ParameterOne bool
  ...
}

因此,现在在控制器函数中,我按如下方式处理绑定:

func RequestHandler() gin.HandlerFunc {
  return func(c *gin.Context) {
    var request ApplicationRequest
    if err := c.Bind(&request.Entities); err != nil {
        responseFunction(http.StatusBadRequest, ..., Message: err.Error()})
        return
    }
    // At this point, the request.Entities slice has ONE element, never more than one
  }
}

注意,我使用的是gin context.Bind(...)函数,因为它隐式地处理JSON或XML的解析,并且适用于我需要的所有其他场景.

希望这能提供足够的背景,任何帮助都将不胜感激!谢谢!

推荐答案

这不是杜松子wine 的问题: unmarshal-xml-array-in-golang-only-getting-the-first-element

以下是两种处理方法:

  • 添加一个根 node ,就像@zangw

  • 通过‘for’更改绑定方法 github.com\gin-gonic\gin@v1.8.1\binding\xml.go line 28 func decodeXML

从…

func decodeXML(r io.Reader, obj any) error {
    decoder := xml.NewDecoder(r)
    if err := decoder.Decode(obj); err != nil {
        return err
    }
    return validate(obj)
}

func decodeXML(r io.Reader, obj any) error {
    decoder := xml.NewDecoder(r)
    for  {
        if err := decoder.Decode(obj); err != nil {
            if err == io.EOF{
                break
            }
            return err
        }
    }
    return validate(obj)
}

Go相关问答推荐

GitHub发布Golang子模块

如何防止程序B存档/删除围棋中程序A当前打开的文件?

如何模拟go的Elastic search SDK?

Golang Gorm Fiber / argon2.Config 未定义

从 wincrypt API 到 Go 的 RC2 解密

Go Gin:验证 base64

我们如何保证取消的上下文会导致 goroutine 终止?

使用Dockertest进行Golang SQL单元测试的基本设置

Golang chromedp Dockerfile

如何使用gosdk在Dynamodb中进行UpdateItem时,将ValueBuilder对象声明为StringSet类型?

Go 中的 Azure JWT 验证不起作用

在 Go 中公开公共 JWK

如何确定作为函数参数传递的指针是否正在被修改或副本是否正在被修改?

如何在golang中按字符a对字符串数组进行排序

go 堆栈跟踪:在某些函数调用参数或返回值之后的问题(?)标记是什么意思?

将 Simple Go Web 应用程序部署到 Elastic Beanstalk

gqlgen go,通过添加一个解析器来减少数据库调用

手动下载并放置一个 golang mod 文件

在 Go 泛型中,如何对联合约束中的类型使用通用方法?

Golang 将类型 [N]byte 转换为 []byte