2014-06-10 55 views
1

我有問題獲得了最基本的操作,但終於弄清楚了。你可以看到我做了什麼here需要幫助在groovy-wslite中重新創建SOAP請求

隨着這項工作,我正在進入後續行動,並再次遇到問題。下面是XML SOAP請求是什麼樣的作品有哪些(在PHP中生成)

<?xml version="1.0" encoding="UTF-8"?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="urn:ws.company.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns2="ws.company.com"> 
    <SOAP-ENV:Header> 
     <ns2:SessionHeader> 
      <ns2:sessionId>theLoginSessionID</ns2:sessionId> 
     </ns2:SessionHeader> 
    </SOAP-ENV:Header> 
    <SOAP-ENV:Body> 
     <ns1:triggerCampaignMessage> 
      <ns1:campaign> 
       <ns1:folderName>theFolder</ns1:folderName> 
       <ns1:objectName>theObject</ns1:objectName> 
      </ns1:campaign> 
      <ns1:recipientData> 
       <ns1:recipient> 
        <ns1:listName> 
         <ns1:folderName>theFolder</ns1:folderName> 
         <ns1:objectName>theObject</ns1:objectName> 
        </ns1:listName> 
        <ns1:emailAddress>[email protected]</ns1:emailAddress> 
       </ns1:recipient> 
       <ns1:optionalData> 
        <ns1:name>order_number</ns1:name> 
        <ns1:value>231</ns1:value> 
       </ns1:optionalData>  
      </ns1:recipientData> 
     </ns1:triggerCampaignMessage> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

我想使用的代碼是這樣的

@Grab(group='com.github.groovy-wslite', module='groovy-wslite', version='0.8.0') 
import wslite.soap.* 

def client = new SOAPClient('https://company/services/WebService') 
def response = client.send(SOAPAction:'https://company/services/WebService/') { 
    body { 
     login('xmlns':'urn:ws.company.com') {[ 
      username("username"), 
      password("password") 
      ]} 
    } 
} 
theSession = response.envelope 
try { 
    response = client.send(SOAPAction:'https://company/services/WebService/') { 
     header { 
      SessionHeader('xmlns':'urn:ws.company.com') { 
       sessionId(theSession) 
      } 
     } 
     body { 
      triggerCampaignMessage('xmlns':'urn:ws.company.com') {[ 
       campaign {[ 
        folderName("theFolder"), 
        objectName("theObject") 
       ]}, 
       recipientData {[ 
        recipient {[ 
         listName {[ 
          folderName("theFolder"), 
          objectName("theObject") 
         ]}, 
         emailAddress("[email protected]") 
        ]}, 
        optionalData {[ 
         name("order_number"), 
         value("1234567890") 
        ]} 
       ]} 
      ]} 
     } 
    } 
} catch (SOAPFaultException sfe) { 
    println "fault string :" + sfe.message // faultcode/faultstring for 1.1 or Code/Reason for 1.2 
    println "envelope :" + sfe.text // prints SOAP Envelope 
    println "status code :" + sfe.httpResponse.statusCode 
    println sfe.fault.detail.text() 
} 

我敢肯定的是,第一個發送到登錄工作,因爲它是所有的作品在它自己的代碼,我收到錯誤消息是

Unexpected subelement {urn:ws.company.com}emailAddress 

所以我猜我沒事到這一點,但不能弄明白。基於XML的作品,任何人都可以幫我讓我的groovy代碼工作?

編輯

下面是從登錄呼叫

<?xml version="1.0" encoding="UTF-8"?> 
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soapenv:Body> 
     <loginResponse xmlns="urn:ws.company.com"> 
      <result> 
       <sessionId>string here</sessionId> 
      </result> 
     </loginResponse> 
    </soapenv:Body> 
</soapenv:Envelope> 

回答

2

該問題可能是與theSession = response.envelope將設置theSession從第一次調用login整個SOAP響應響應信封。我的猜測是,你真的需要從登錄響應消息中的某個元素搶令牌值,例如:

theSession = response.loginResponse.result.sessionId.text()

如果你能以login提供結果的樣本來自呼叫我可以試試以提供更準確的答案。

+0

感謝您的迴應,當我只是做登錄電話,然後println'envelope:'+ response.envelope它打印輸出只是sessionID。你仍然認爲這是問題嗎? – dscl

+0

我也剛剛編輯了問題,包括初始登錄回覆信封 – dscl

+0

我更新了我的答案。即使一個println只在xml中顯示文本值,響應變量本身也是一個XmlSlurper GPathResult,我認爲在第二次調用中使用它時會導致問題。 –