Página 1 de 3

Acceso a Web Services usando SOAP y WSDL

NotaPublicado: 2007-10-25 05:31 @272
por Ithilien
Hola,

soy nuevo en Perl y tengo el problema de que intento hacer una llamada a un método que tengo a partir de un WSDL. Este método ha de recibir parámetros.

Una vez que he hecho la llamada a ese método imagino que tendré la respuesta de éste en un documento XML, que es el que quiero explorar (me baso en la experiencia que tengo sobre SOAP en PHP).

Para hacer eso, hago uso de SOAP::Lite y le indico dónde está el WSDL. Posteriormente llamo al método con los parámetros adecuados y luego le hago un print. El resultado es algo como HASH(0x48a4760). Mi código es el siguiente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!perl -w

use SOAP::Lite;

my $soapclient = SOAP::Lite
                    ->service('https://... .WSDL');

my $result = $soapclient->Operation("5", "Hello", ... , "Bye");

print $result;
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4


Tampoco tengo muy claro cómo puedo testear el éxito de la operación porque no sé qué métodos puedo invocar ( he probado con is_success, fault...y nada ). ¿Alguien me puede ayudar?

Gracias de antemano

NotaPublicado: 2007-10-25 06:34 @315
por explorer
$result está almacenando una referencia a un hash.

Recuerda: cuando trabajamos con XML (y con cualquier estructura de datos complicada en Perl), nuestro mayor aliado es el módulo Data::Dumper, para que nos diga qué es lo que realmente está dentro de nuestras variables.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use Data::Dumper;
print Dumper($result);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

NotaPublicado: 2007-10-25 07:06 @338
por Ithilien
¡Muchísimas gracias!

No sabes lo que es poder chequear lo que se obtiene al hacer el request.

Ahora, lo único que me pasa es que en el response, me dice que el string que tengo que pasar, tiene formato inválido. Es una cadena de caracteres, pero no sé si tanto los int, como doubles o floats han de pasarse entre comillas o por el contrario, esto solo ocurre en las cadenas.

¡Gracias de nuevo!

NotaPublicado: 2007-10-25 10:56 @497
por Ithilien
Hola de nuevo.

Si os fijáis, yo tengo una serie de parámetros que los paso de la forma:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $result = $soapclient->Operation("5", "Hello", ... , "Bye");
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


y luego hago un print Dumper($result);. El problema que hay es que al parecer, los parámetros no se pasan bien, o al menos eso es lo que me dice el mensaje de respuesta almacenado en $result. No sé porqué es puesto que hago también he hecho un dumper del soapclient y no veo el problema, todos los datos están donde deberían estar. Me da la impresión que tiene algo que ver con los Namespaces o con el SoapAction.

¿Alguien me puede ayudar?

También me sería muy útil el cómo saber como puedo obtener el documento XML de la Request que se va a enviar al servidor. De esta manera, puedo ver en qué cosas esta fallando.

¡¡¡Muchas gracias otra vez!!!

NotaPublicado: 2007-10-25 14:52 @661
por explorer
¿Pero todos los parámetros son strings? En el anterior mensaje dices que quieres pasar enteros y números en punto flotante.

Lo que no recuerdo ahora es si hay que serializarlos o no.

En este foro hay ejemplos con SOAP. Usa el sistema de búsqueda.

NotaPublicado: 2007-10-26 02:22 @140
por Ithilien
Hola Explorer,

hay variedad en los tipos de parametros. Hay enteros y strings. Lo que pasa es que yo primero los capturo y los guardo en variables y luego son esas variables las que paso como parametros en la llamada al web service.

Lo que ocurre es que de alguna manera se hace algo mal pues he hecho un Dumper de mi Soap Client y los datos estan bien metidos. Hay problemas con algo que no se que es. Yo creo que es de los Namespaces o de los SoapActions, pero ya no lo se.

El problema es que he buscado por muchisimos sitios de internet y la informacion que encuentro no me sirve. Por ejemplo en un sitio, cuando ejecutan el web service llaman ( con ->result ) y lo imprimen y lo he intentado y a mi me da error; cosas asi.

Si te da por buscar y encuentras algo te agradeceria que lo postearas.

Saludos y gracias!

NotaPublicado: 2007-10-26 07:25 @351
por explorer
¿Has mirado los hilos con SOAP de este web?

Creo recordar que se puede activar el modo debug para ver qué es lo que está haciendo.

Primero tienes que sacar el xml que se prepara con la petición. Luego ver qué es lo que entiende el servidor (después de haber leído la petición) y finalmente, sacar el xml con la respuesta del servidor.

NotaPublicado: 2007-10-29 05:10 @257
por Ithilien
Explorer,

¿Podrías echarme un cable con la extracción del XML?

Si tengo tanto el request como el response sabré dónde está fallando mi programa.

El problema que tengo es que: primero, no sé cómo, a partir de los datos que yo supuestamente envió, puedo visualizar la petición en formato XML que es lo que me interesa; y segundo, después de ejecutar la llamada al servicio y almacenarla en una variable, poder extraer el documento XML de la respuesta del servidor. Necesito algún ejemplo porque no hago más que mirar en hilos y especificaciones y no me queda nada claro.

Gracias de antemano.

Saludos!

NotaPublicado: 2007-10-29 08:48 @408
por explorer
Ver algo de tu código estaría bien...

El hilo que más se parece a tu caso es este.

NotaPublicado: 2007-10-29 09:14 @426
por Ithilien
Ok, mi código no es más que esto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!perl -w

use SOAP::Lite;                      
use Data::Dumper;
use XML::Dumper;

print "Content-Type: text/html\n\n";
print "<html>\n";
print "<pre>";
print "<head>\n";
print "<title>Using Perl & SOAP</title>\n";
print "</head>\n";
print "<body>\n";

my $soapClient = SOAP::Lite
        ->service('https://servidor/file.wsdl');

die "[Error]: Can't create the SOAP client. Reason: $!\n" unless $soapClient;

my $param1 = SOAP::Data->name('param1')->value(5)->type('int');
my $param2 = SOAP::Data->name('param2')->value('aaabbbccc')->type('string');
my $param3 = SOAP::Data->name('param3')->value(8)->type('int');

#Doing the  operation
my $result = $soapClient->Operation(
    $param1,
    $param2,
    $param3,
    );
   
my $fileResult = "C:/Result.xml";
my $xmlResult  = pl2xml( $result, $fileResult );

my $fileSOAP = "C:/SOAP.xml";
my $xmlSOAP = pl2xml( $soapClient , $fileSOAP );
   
print "<h1>Result</h1>\n";  
print Dumper($result);
print "\n<h1>Content of SOAP Client</h1>\n";
print Dumper($soapClient);
   
print "</body>\n";
print "</pre>";
print "</html>\n";
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Teniendo esto, lo que me pasa es que no puedo acceder a los XML de solicitud / respuesta que "debiera crear" el SOAP (hablo de lo que ocurre por ejemplo en PHP). Entonces, cuando trato de ver los documentos XML que transformo, no veo más que las estructuras de datos puestas como XML, pero realmente no consigo tener nada útil, nada que se envía.

Por eso quería saber cómo puedo hacerlo, y ya puestos, diré que estoy usando XAMPP con el Add-on del Perl para desarrollar todo bajo un servidor Apache que alojo en localhost ( bajo Windows ). No sé si existe algún paquete mejor para llevar a cabo el desarrollo de estas tareas.

¡Muchas gracias!