为了账号安全,请及时绑定邮箱和手机立即绑定

Golang Gin 绑定请求正文 XML 到切片

Golang Gin 绑定请求正文 XML 到切片

Go
慕尼黑8549860 2023-03-07 14:34:04
我对 Gin 中的默认绑定有疑问。我有一个传入请求,其中主体是多个 Entity 对象,如下所示:<Entity>  <Name>Name One here</Name>  ...</Entity><Entity>  <Name>Name Two here</Name>  ...</Entity>我的目标是将它映射到相应的切片。所以所需对象的结构是这样的:type Entity struct {  XMLName xml.Name `bson:"-" json:"-" xml:"Entity"`  Name   string    `bson:"name,omitempty" json:",omitempty" xml:",omitempty"`  ...}我遇到的问题是,无论在请求正文中传递了多少对象,都只有一个提供的对象被映射到切片中。请注意,请求的 JSON 版本可以正确解析。[ {   Name: "Name One",   ... }, {   Name: "Name Two",   ... }]我有一个模型请求结构的结构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 的解析,并且适用于我需要的所有其他场景。希望这提供了足够的上下文,任何帮助将不胜感激!谢谢!
查看完整描述

1 回答

?
慕仙森

TA贡献1827条经验 获得超7个赞

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

以下是两种处理方法:

  • 添加一个根节点就像@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)

}


查看完整回答
反对 回复 2023-03-07
  • 1 回答
  • 0 关注
  • 109 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信