拆封围棋

拆封围棋

问题描述:

我想提出一个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没有打印任何东西外,其他人都是正确的。
我想不通为什么。 任何帮助,将不胜感激。

+0

您可以尝试将所有标记名称更改为'xml'吗? (https://play.golang.org/p/H4CA7DqVni) – mkopriva

+0

@mkopriva我按照你的建议做了,它有点工作。 当我将所有标记名称更改为xml时,我不能再解组该响应,但我可以完全解组您的示例中的'data'变量。 第一个问题是,为什么会发生这种情况? 第二个是你的示例中的'data'变量和'ioutil.ReadAll(resp.Body)'有什么区别?我还没搞清楚。 – Sam

+0

你是否100%确定你提供的样本响应与'responseBody'的内容结构相同? – mkopriva

您可以解析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