GroovyWS和复杂请求
问题描述:
我遇到了使用GroovyWS发送复杂请求的问题。GroovyWS和复杂请求
这是由soapUI的生成样品要求:
<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:dex="http://www.temp.com/com/dex"
>
<soapenv:Header/>
<soapenv:Body>
<dex:executeRequest>
<!--Optional:-->
<a>?</a>
<!--Optional:-->
<b>?</b>
<!--Optional:-->
<parameters>
<!--Zero or more repetitions:-->
<parameter>
<!--Optional:-->
<key>?</key>
<!--Optional:-->
<value>?</value>
</parameter>
</parameters>
<!--Optional:-->
<c>?</c>
<!--Optional:-->
<d>?</d>
</dex:feedrequest>
</soapenv:Body>
</soapenv:Envelope>
片的Groovy代码:
def proxy = webService.getClient(grailsApplication.config.ws.endpoint);
proxy.processdRequest(?);
所以,我应该通过代替?。
感谢您的帮助。
-vova。
答
非常感谢比尔。
我只是想为未来的读者添加一些信息。
要Grails中启用日志记录GroovyWS:
log4j = {
debug 'grails.app',
'groovyx.net.ws',
'org.apache.cxf'
}
以此为提到比尔,你可以看到类的名称。
还有一件事:parameters
可能有不同的类型。不是List<?>
。这就是为什么它应该被创建。
def params = proxy.create('com.temp.feeds.FeedRequestType$Parameters');
要检索新创建的对象可用的方法和字段,你可以使用Groovy反思:
params.class.methods.each{
println it;
}
params.class.fields.each{
println it;
}
这一切!
-vova
答
为了将数据传递给Web服务调用,GroovyWS为您需要的每个参数类型动态创建类。例如,如果web服务电话是:
public int passSomeArgs(Arg1Type a, Arg2Type b);
GroovyWS将动态创建一个Arg1Type类和Arg2Type类,你可以通过对代理的方法访问。
// this will instantiate an Arg1Type for you
def arg1 = proxy.create("ns1.ns2.Arg1Type");
// this will instantiate an Arg2Type for you
def arg2 = proxy.create("ns1.ns2.Arg2Type");
然后,您可以使用数据填充ARG1/arg2的情况下,让您的来电:
int ret = proxy.passSomeArgs(arg1, arg2);
注意,也有可能参与类的一些命名空间创建。我使用了作为GroovyWS正在处理WSDL的CXF日志记录来查看CXF认为类名实际上应该如何。
答
谢谢!我得到GroovyWS与一个非常复杂的Web服务工作!
我的步骤:我打开调试获得根类,然后做反射代码来获取内部类,然后继续设置属性并检查它是否是字符串或列表。
和瞧!
def proxy = new WSClient(wsdl,this.class.classLoader)
proxy.initialize()
def f2bCobranca = proxy.create("br.com.f2b.soap.wsbilling.F2BCobranca") //got with debug on
//Show me inner classes of root class
f2bCobranca.class.fields.each { log.debug it }
f2bCobranca.class.methods.each { log.debug it }
f2bCobranca.cobranca = proxy.create('br.com.f2b.soap.wsbilling.F2BCobranca$Cobranca')
f2bCobranca.cobranca.demonstrativo << 'teste' //it's a list!
f2bCobranca.cobranca.sacadorAvalista = 'teste jose'
f2bCobranca.cobranca.desconto = proxy.create('br.com.f2b.soap.wsbilling.F2BCobranca$Cobranca$Desconto')
f2bCobranca.cobranca.multa = proxy.create('br.com.f2b.soap.wsbilling.F2BCobranca$Cobranca$Multa')
def sacado1 = proxy.create('br.com.f2b.soap.wsbilling.F2BCobranca$Sacado')
sacado1.nome = "teste ${new Date()}"
sacado1.email << '[email protected]'
sacado1.endereco = proxy.create('br.com.f2b.soap.wsbilling.F2BCobranca$Sacado$Endereco')
sacado1.telefone = proxy.create('br.com.f2b.soap.wsbilling.F2BCobranca$Sacado$Telefone')
sacado1.telefoneCom = proxy.create('br.com.f2b.soap.wsbilling.F2BCobranca$Sacado$TelefoneCom')
sacado1.telefoneCel = proxy.create('br.com.f2b.soap.wsbilling.F2BCobranca$Sacado$TelefoneCel')
sacado1.cpf = ''
sacado1.cnpj = ''
sacado1.observacao = ''
f2bCobranca.sacado << sacado1
def retorno = proxy.RegisterWSBilling(f2bCobranca)
log.debug retorno