GroovyWS和复杂的请求

trn*_*rnl 8 grails groovy web-services 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>
Run Code Online (Sandbox Code Playgroud)

一段时髦的代码:

def proxy = webService.getClient(grailsApplication.config.ws.endpoint);
proxy.processdRequest(?);
Run Code Online (Sandbox Code Playgroud)

那么我应该通过什么而不是.

谢谢你的帮助.

-vova.

bil*_*dev 6

GroovyWS为您将数据传递给Web服务调用所需的每个参数类型动态创建类.例如,如果webservice调用是:

public int passSomeArgs( Arg1Type a, Arg2Type b );
Run Code Online (Sandbox Code Playgroud)

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" );  
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用数据填充arg1/arg2实例并拨打电话:

int ret = proxy.passSomeArgs( arg1, arg2 );
Run Code Online (Sandbox Code Playgroud)

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


trn*_*rnl 5

非常感谢比尔.

我只想为将来的读者添加一些信息.

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

log4j = {
   debug 'grails.app',
         'groovyx.net.ws',
         'org.apache.cxf'
}
Run Code Online (Sandbox Code Playgroud)

有了这个提到比尔你可以看到类的名称.


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

def params = proxy.create('com.temp.feeds.FeedRequestType$Parameters');
Run Code Online (Sandbox Code Playgroud)

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

params.class.methods.each{
        println it;
}
params.class.fields.each{
        println it;
}
Run Code Online (Sandbox Code Playgroud)

就这样!

-vova