Go语言 如果字段名称与结构的XMLName不同,则设置字段名称

afdcj2ne  于 2022-12-07  发布在  Go
关注(0)|答案(2)|浏览(188)

gowsdl生成的一组类型基于NetSuite SuiteTalk web service definition

<complexType name="TokenPassportSignature">
   <simpleContent>
       <extension base="xsd:string">
          <attribute name="algorithm" type="xsd:string" use="required"/>
       </extension>
    </simpleContent>
 </complexType>
 <complexType name="TokenPassport">
    <sequence>
       <element name="account" type="xsd:string"/>
       <element name="consumerKey" type="xsd:string"/>
       <element name="token" type="xsd:string"/>
       <element name="nonce" type="xsd:string"/>
       <element name="timestamp" type="xsd:long"/>
       <element name="signature" type="platformCore:TokenPassportSignature"/>
    </sequence>
</complexType>

它创建了以下类型:

type TokenPassportSignature struct {
    XMLName xml.Name `xml:"urn:core_2018_2.platform.webservices.netsuite.com TokenPassportSignature"`
    Value string
    Algorithm string `xml:"algorithm,attr,omitempty"`
}

type TokenPassport struct {
    XMLName xml.Name `xml:"urn:core_2018_2.platform.webservices.netsuite.com TokenPassport"`
    Account string `xml:"account,omitempty"`
    ConsumerKey string `xml:"consumerKey,omitempty"`
    Token string `xml:"token,omitempty"`
    Nonce string `xml:"nonce,omitempty"`
    Timestamp int64 `xml:"timestamp,omitempty"`
    Signature *TokenPassportSignature `xml:"signature,omitempty"`
}

当我尝试通过客户机处理它时,XML编码过程不喜欢Signature字段具有冲突的名称。
xml:main.TokenPassport.Signature的标记中的名称“签名”与 *main. TokenPassport签名.XMLName中的名称“TokenPassport签名”冲突
我使用extracted out the relevant bits into Go Playground来确认这是引发错误的编码器。根据Marhsal的文档,似乎字段必须匹配:
如果结构字段的XML名称是由字段标记和结构的XMLName字段定义的,则这两个名称必须相符。
有什么想法吗?

1wnzp6jl

1wnzp6jl1#

或者,您可能更喜欢保留嵌入式结构的名称TokenPassportSignature而不是名称signature。如果字段的命名,则该行变为:

Signature *TokenPassportSignature `xml:",omitempty"`

Code adapted

zwghvu4y

zwghvu4y2#

不知道什么对你不起作用,但这对我起作用了,最近版本的netsuite wsdl和gowsdl:

nonce:=RandStringBytes(20)
timestamp:=strconv.FormatInt(time.Now().Unix(),10)    
baseString:= strings.Join([]string{account, consumer_key, token, nonce, timestamp}, "&")
secretString:= strings.Join([]string{consumer_secret, token_secret}, "&")
signature := HashHmacSha256(baseString, secretString)

tokenPassportSignature:= netsuite.TokenPassportSignature {
    Value: signature,
    Algorithm: "HMAC-SHA256",
}    
tokenPassport:= netsuite.TokenPassport {
    Account: account,
    ConsumerKey: consumer_key,
    Token: token,
    Nonce: nonce,
    Timestamp: time.Now().Unix(),
    Signature: &tokenPassportSignature,
}
client := soap.NewClient("https://12345-sb1.suitetalk.api.netsuite.com/services/NetSuitePort_2022_1")
client.AddHeader(tokenPassport)

使用

type TokenPassportSignature struct {
    XMLName xml.Name `xml:"signature"`
    Value string `xml:",chardata" json:"-,"`
    Algorithm string `xml:"algorithm,attr,omitempty" json:"algorithm,omitempty"`
}
type TokenPassport struct {
    XMLName xml.Name `xml:"tokenPassport"`
    Account string `xml:"account,omitempty" json:"account,omitempty"`
    ConsumerKey string `xml:"consumerKey,omitempty" json:"consumerKey,omitempty"`
    Token string `xml:"token,omitempty" json:"token,omitempty"`
    Nonce string `xml:"nonce,omitempty" json:"nonce,omitempty"`
    Timestamp int64 `xml:"timestamp,omitempty" json:"timestamp,omitempty"`
    Signature *TokenPassportSignature `xml:"signature,omitempty" json:"signature,omitempty"`
}

完整的概念验证:https://github.com/mk-j/go-netsuite-soap

相关问题