Question

J'ai été confronté à un problème d'envoi des demandes complexes avec GroovyWS.

C'est l'exemple de la demande générée par 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>

le morceau de code groovy:

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

Donc ce que je doit passer au lieu de ?.

Merci pour votre aide.

-vova.

Était-ce utile?

La solution 2

Merci beaucoup Bill.

Je veux juste ajouter un peu d'info pour les futurs lecteurs.

Pour activer la journalisation pour GroovyWS dans Graal:

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

Avec ce projet, vous pouvez voir les noms des classes.


Une chose de plus: parameters peut avoir différent type.Pas List<?>.C'est pourquoi il doit être créé.

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

Pour récupérer les méthodes disponibles et les champs pour les objets nouvellement créés, vous pouvez utiliser Groovy réflexion:

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

C'est tout!

-vova

Autres conseils

Groovyws crée de manière dynamique des cours pour chacun des types d'arguments dont vous avez besoin afin de transmettre des données à l'appel de service Web.Par exemple, si l'appel WebService était:

public int passSomeArgs( Arg1Type a, Arg2Type b );

Groovyws créerait de manière dynamique une classe Arg1Type et une classe Arg2Type, que vous pourriez accéder via une méthode sur le proxy.

// 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" );  

Vous pouvez ensuite remplir l'instance Arg1 / Arg2 avec des données et faire appel à votre appel:

int ret = proxy.passSomeArgs( arg1, arg2 );

Note, il y a probablement des espaces de noms impliqués dans les classes créées.J'ai utilisé la journalisation CXF imprimée en tant que Groovyws traitait la WSDL pour voir ce que CXF pensait que les noms de classe devraient réellement être.

merci!J'ai eu Groovyws travaillant avec un service Web vraiment complexe!

Mes étapes: j'ai allumé débogage pour obtenir la classe racine, puis ce code de réflexion pour obtenir des classes intérieures et continuer à définir des propriétés et vérifiez s'il s'agit de chaîne ou de liste.

et 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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top