拆封围棋
问题描述:
我想提出一个SOAP调用的API SOAP响应,下面是一个简单的回应:拆封围棋
<?xml version="1.0" encoding="utf-8" ?>
<soapenv:envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:body>
<soapenv:fault>
<faultcode>
ERR109
</faultcode>
<faultstring>
Account Expired. Result code is 2163
</faultstring>
<detail>
<ns1:serviceexception xmlns:ns1="http://www.csapi.org/schema/parlayx/common/v2_1">
<messageid>
ERR109
</messageid>
<text>
Account Expired. Result code is 2163
</text>
<variables>
2163
</variables>
</ns1:serviceexception>
</detail>
</soapenv:fault>
</soapenv:body>
</soapenv:envelope>
解编这种反应,我已经建立了一些结构:
type SoapResponse struct {
Body ResponseBody `soapenv:"body"`
}
type ResponseBody struct {
Fault Fault `soapenv:"fault"`
}
type Fault struct {
FaultCode string `xml:"faultcode"`
FaultString string `xml:"faultstring"`
Detail Detail `xml:"detail"`
}
type Detail struct {
ServiceException ServiceException `ns1:"serviceexception"`
}
type ServiceException struct {
ID string `xml:"messageid"`
MessageText string `xml:"text"`
ErrorCode string `xml:"variables"`
}
这里是做了拆封部分代码:
responseBody, _:= ioutil.ReadAll(resp.Body)
var soapResponse = new(SoapResponse)
err := xml.Unmarshal(responseBody, soapResponse)
if err != nil {
panic("Error!")
}
的问题是,所有soapResponse
properti除了soapResponse.Body.Fault.Detail.ServiceException.ID
没有打印任何东西外,其他人都是正确的。
我想不通为什么。 任何帮助,将不胜感激。
答
您可以解析XML得到了这样的结构:
type SoapResponse struct {
Body ResponseBody `xml:"soapenv body"`
}
type ResponseBody struct {
Fault Fault `xml:"fault"`
}
type Fault struct {
FaultCode string `xml:"faultcode"`
FaultString string `xml:"faultstring"`
Detail Detail `xml:"detail"`
}
type Detail struct {
ServiceException ServiceException `xml:"serviceexception"`
}
type ServiceException struct {
ID string `xml:"messageid"`
MessageText string `xml:"text"`
ErrorCode string `xml:"variables"`
}
我已经添加了命名空间的第一个元素,并修正了一些定义。工作示例 - https://play.golang.org/p/vZQhaxYikX
您可以尝试将所有标记名称更改为'xml'吗? (https://play.golang.org/p/H4CA7DqVni) – mkopriva
@mkopriva我按照你的建议做了,它有点工作。 当我将所有标记名称更改为xml时,我不能再解组该响应,但我可以完全解组您的示例中的'data'变量。 第一个问题是,为什么会发生这种情况? 第二个是你的示例中的'data'变量和'ioutil.ReadAll(resp.Body)'有什么区别?我还没搞清楚。 – Sam
你是否100%确定你提供的样本响应与'responseBody'的内容结构相同? – mkopriva