2017-10-05 145 views
4

我想提出一個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

回答

2

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