需要帮助在groovy-wslite中重新创建SOAP请求

时间:2014-06-10 19:42:21

标签: soap groovy

我在解决最基本的行动方面遇到了问题,但终于弄明白了。你可以看到我做了什么here

随着这项工作,我正在进行后续行动,并再次遇到问题。以下是XML SOAP Request的工作原理(在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>person@company.com</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("person@company.com")
                    ]},
                    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>

1 个答案:

答案 0 :(得分:2)

问题可能出在theSession = response.envelope,它会在第一次调用theSession时将login设置为整个SOAP响应。我的猜测是你真的需要从登录响应消息中的元素中获取一个标记值,例如:

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

如果您可以通过致电login提供结果样本,我可以尝试提供更准确的答案。