Pregunta

Me he enfrentado al problema de enviar solicitudes complejas con GroovyWS.

Esta es una solicitud de muestra generada por 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>

el fragmento de código maravilloso:

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

Entonces, ¿qué debería aprobar en lugar de ?.

Gracias por tu ayuda.

-vová.

¿Fue útil?

Solución 2

Muchas gracias Bill.

Sólo quiero agregar algo de información para futuros lectores.

Para activar el registro de GroovyWS en Grails:

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

Con esto, como mencionó Bill, puedes ver los nombres de las clases.


Una cosa más: parameters puede tener diferente tipo.No List<?>.Por eso también debería crearse.

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

Para recuperar métodos y campos disponibles para objetos recién creados, puede utilizar la reflexión Groovy:

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

¡Eso es todo!

-vová

Otros consejos

GroovyWS crea dinámicamente las clases para cada uno de los tipos de argumentos que necesita para pasar datos a la llamada de servicio web.Por ejemplo, si la llamada de servicio web fue:

public int passSomeArgs( Arg1Type a, Arg2Type b );

GroovyWS crearía dinámicamente una clase ARG1TYPE y una clase ARG2TYPE, que podría acceder a través de un método en el 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" );  

Puede rellenar la instancia ARG1 / ARG2 con los datos y realizar su llamada:

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

Nota, probablemente hay algunos espacios de nombres involucrados en las clases que se están creando.Utilicé el registro CXF que se imprimió, ya que GroovyWS estaba procesando el WSDL para ver qué pensó CXF que realmente deberían ser los nombres de las clases.

¡Gracias!¡Tengo Groovyws trabajando con un servicio web realmente complejo!

Mis pasos: Encendí la depuración para obtener la clase raíz, luego hice ese código de reflexión para obtener clases interiores, y continuar con las propiedades de configuración y verificar si es una cadena o lista.

y 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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top