我對 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 的決議,并且適用于我需要的所有其他場景。
希望這提供了足夠的背景關系,任何幫助將不勝感激!謝謝!
uj5u.com熱心網友回復:
這不是杜松子酒問題: unmarshal-xml-array-in-golang-only-getting-the-first-element
以下是兩種處理方式:
添加一個根節點,就像@zangw
通過“for”更改系結方法
github.com\gin-gonic\[email protected]\binding\xml.goline 28func 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)
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/522794.html
標籤:去去金酒
上一篇:context.TODO()或context.Background(),我應該更喜歡哪一個?
下一篇:goudp請求(包)丟失
