首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GroovyWS和复杂请求

GroovyWS和复杂请求
EN

Stack Overflow用户
提问于 2010-07-23 10:51:06
回答 3查看 2.4K关注 0票数 8

我面临着用GroovyWS发送复杂请求的问题。

这是由soapUI生成的示例请求:

代码语言:javascript
复制
<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代码片段:

代码语言:javascript
复制
def proxy = webService.getClient(grailsApplication.config.ws.endpoint);
proxy.processdRequest(?);

所以我应该传递什么而不是。

谢谢你的帮助。

-vova。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-07-28 07:58:19

非常感谢比尔。

我只想为未来的读者添加一些信息。

要打开Grails中的GroovyWS日志记录:

代码语言:javascript
复制
log4j = {
   debug 'grails.app',
         'groovyx.net.ws',
         'org.apache.cxf'
}

正如前面提到的,Bill可以看到这些类的名称。

还有一件事:parameters可能有不同的类型。不是List<?>。这就是为什么它也应该被创造出来。

代码语言:javascript
复制
def params = proxy.create('com.temp.feeds.FeedRequestType$Parameters');

要检索新创建的对象的可用方法和字段,可以使用Groovy反射:

代码语言:javascript
复制
params.class.methods.each{
        println it;
}
params.class.fields.each{
        println it;
}

就这样!

-vova

票数 5
EN

Stack Overflow用户

发布于 2010-07-25 06:34:07

GroovyWS为您需要的每个参数类型动态创建类,以便将数据传递给web服务调用。例如,如果webservice调用是:

代码语言:javascript
复制
public int passSomeArgs( Arg1Type a, Arg2Type b );

GroovyWS将动态创建一个Arg1Type类和一个Arg2Type类,您可以通过代理上的方法访问它们。

代码语言:javascript
复制
// 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实例并进行调用:

代码语言:javascript
复制
int ret = proxy.passSomeArgs( arg1, arg2 );

注意,在创建的类中可能涉及到一些名称空间。我使用在GroovyWS处理WSDL时打印的CXF日志记录来查看CXF认为类名应该是什么。

票数 6
EN

Stack Overflow用户

发布于 2010-09-05 07:55:19

谢谢!我让GroovyWS使用了一个非常复杂的with服务!

我的步骤是:打开debug获得根类,然后执行反射代码获取内部类,然后继续设置属性并检查它是否是字符串或列表。

还有哇!

代码语言:javascript
复制
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 << 'teste@wanswins.com.br'
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
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3317453

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档