Groovywsと複雑な要求
-
28-09-2020 - |
質問
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
解決 2
多くの感謝簿。
将来の読者にいくつかの情報を追加したいだけです。
GrailsのGroovywsのロギングをオンにする:
log4j = {
debug 'grails.app',
'groovyx.net.ws',
'org.apache.cxf'
}
.
これが言及された紙幣の名前を見ることができます。
もう1つのこと:parameters
は異なるタイプを持つことができます。List<?>
ではありません。それが作成されるべきな理由です。
def params = proxy.create('com.temp.feeds.FeedRequestType$Parameters');
.
新しく作成されたオブジェクトの利用可能なメソッドとフィールドを取得するには、Groovy Reflection:
を使用できます。params.class.methods.each{
println it;
}
params.class.fields.each{
println it;
}
.
それはすべてです!
-vova
他のヒント
GroovyWSは、Webサービス呼び出しにデータを渡すために必要な各引数型のクラスを動的に作成します。たとえば、WebService Callが次のものであった場合:
public int passSomeArgs( Arg1Type a, Arg2Type b );
.
GroovyWSは、Proxy上のメソッドを介してアクセスできる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として印刷されたCXFロギングを使用して、クラス名が実際にクラス名があると思ったのかを確認するためにWSDLを処理していました。
ありがとう!私は本当に複雑なWebServiceを使って働くGroovywsを手に入れました!
マイステップ:私はDebugをオンにしてルートクラスを取得し、その反映コードをインナークラスを取得し、プロパティの設定を行い、文字列またはリストであるかどうかを確認しました。
とVoilá!
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
.