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.
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认为类名实际应该是什么.
非常感谢比尔.
我只想为将来的读者添加一些信息.
要在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
| 归档时间: |
|
| 查看次数: |
2345 次 |
| 最近记录: |