Grails 2.6基于本地WSDL构建带认证的SOAP请求求助
Grails 2.6 对接SOAP服务(带认证+本地WSDL)入门
依赖配置
groovy-wslite 依赖(推荐)
修改 grails-app/conf/BuildConfig.groovy,添加依赖:
dependencies { compile 'com.github.groovy-wslite:groovy-wslite:1.1.3' }
核心实现
1. 初始化SOAP客户端(基于本地WSDL)
利用本地WSDL生成动态客户端,同时指定远程服务地址:
import wslite.soap.SOAPClient import wslite.http.HTTPBasicAuthorization // 本地WSDL文件路径,根据实际位置调整 def wsdlPath = "web-app/WEB-INF/wsdl/AXLAPI.wsdl" def wsdlFile = new File(grailsApplication.mainContext.getResource(wsdlPath).file.path) def soapClient = new SOAPClient(wsdlFile) // 覆盖WSDL中的服务地址,指向远程服务器 soapClient.url = "https://your-cucm-server/axl/"
2. 配置Basic认证
Cisco AXL服务通常用HTTP Basic认证,直接在客户端设置:
soapClient.authorization = new HTTPBasicAuthorization("your-username", "your-password")
3. 调用接口并解析响应
方式一:动态调用(基于WSDL,更简洁)
import wslite.soap.SOAPResponse try { SOAPResponse response = soapClient.send { // SOAPAction需与SOAPUI请求中的一致,Cisco AXL格式为 CUCM:DB ver=版本号 方法名 soapAction = "CUCM:DB ver=14.0 getCCMVersion" body { getCCMVersion('xmlns':'http://www.cisco.com/AXL/API/14.0') } } // 解析响应获取版本号 def ccmVersion = response.Body.getCCMVersionResponse.return.componentVersion.version.text() println "CUCM版本:${ccmVersion}" } catch (Exception e) { log.error("SOAP调用失败", e) }
方式二:手动构造XML(与SOAPUI请求完全一致)
如果不想依赖WSDL动态生成,直接构造XML请求:
try { def response = soapClient.send { soapNamespace = "http://schemas.xmlsoap.org/soap/envelope/" envelopeAttributes = ['xmlns:ns':"http://www.cisco.com/AXL/API/14.0"] body { 'ns:getCCMVersion'() } } def ccmVersion = response.Body['ns:getCCMVersionResponse'].return.componentVersion.version.text() println "CUCM版本:${ccmVersion}" } catch (Exception e) { log.error("SOAP调用失败", e) }
常见问题处理
- HTTPS证书问题:如果远程服务器证书不被信任,可临时禁用校验(生产环境不建议):
soapClient.httpClient.sslTrustAllCerts = true - SOAPAction错误:务必从SOAPUI的请求头中复制准确的SOAPAction值,否则服务会返回错误
- WSDL路径问题:确保WSDL文件在Grails项目的可访问路径下,可使用
grailsApplication.mainContext.getResource()获取绝对路径
内容的提问来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

