【问题标题】:GroovyWS and complex requestsGroovyWS 和复杂请求
【发布时间】:2010-07-23 10:51:06
【问题描述】:

我遇到了使用 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>

一段时髦的代码:

def proxy = webService.getClient(grailsApplication.config.ws.endpoint);
proxy.processdRequest(?);

那么我应该传递什么而不是

感谢您的帮助。

-vova.

【问题讨论】:

    标签: grails web-services groovy groovyws


    【解决方案1】:

    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 认为类名实际上应该是什么。

    【讨论】:

      【解决方案2】:

      非常感谢比尔。

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

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

      log4j = {
         debug 'grails.app',
               'groovyx.net.ws',
               'org.apache.cxf'
      }
      

      通过上面提到的 Bill,您可以看到类的名称。


      还有一件事:parameters 可能有不同的类型。不是List&lt;?&gt;。这就是为什么它也应该被创建。

      def params = proxy.create('com.temp.feeds.FeedRequestType$Parameters');
      

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

      params.class.methods.each{
              println it;
      }
      params.class.fields.each{
              println it;
      }
      

      就是这样!

      -vova

      【讨论】:

        【解决方案3】:

        谢谢!我让 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 << '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
        

        【讨论】:

          猜你喜欢
          • 2020-04-30
          • 1970-01-01
          • 2019-02-08
          • 2016-09-24
          • 1970-01-01
          • 2015-09-16
          • 1970-01-01
          • 1970-01-01
          • 2023-04-06
          相关资源
          最近更新 更多