我在解决最基本的行动方面遇到了问题,但终于弄明白了。你可以看到我做了什么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>
答案 0 :(得分:2)
问题可能出在theSession = response.envelope
,它会在第一次调用theSession
时将login
设置为整个SOAP响应。我的猜测是你真的需要从登录响应消息中的元素中获取一个标记值,例如:
theSession = response.loginResponse.result.sessionId.text()
如果您可以通过致电login
提供结果样本,我可以尝试提供更准确的答案。