• Publicidad

SOAP::Lite

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

SOAP::Lite

Notapor sergioc » 2008-08-13 16:41 @737

Buen día tengan todos, llego a ustedes para ver si alguien pudiera apoyarme con una duda que tengo, el planteamiento es el siguiente:

1. Estoy consumiendo un Web Service de .NET a través de SOAP::Lite, coloco el "proxy", el "uri" y el "on_action"; posteriormente mando a llamar el método correspondiente y paso los parámetros que es solo una como un test para obtener respuesta; el caso es que al revisar el debug observo que todo es correcto pero la respuesta nunca llega; el método del Web Service solo recibe y devuelve el parámetro enviado, a continuación ejemplifico con código para ser más claro:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
use SOAP::Lite +trace => [qw(debug)];

my $soap = SOAP::Lite
            -> proxy('http://127.0.0.1:80/empresa/servicios.asmx')
            -> uri('http://tempuri.org/')
            -> on_action( sub { sprintf '%s%s', @_ } );

my $resultado = $soap->Test( SOAP::Data->name(cCadenda => 'HOLA'));

print "\nRESULTADO : $resultado \n";

exit;
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

ahora colocaré el resultado del debug:

Código: Seleccionar todo
SOAP::Transport::HTTP::Client::send_receive: POST http://127.0.0.1:80/empresa/servicios.asmx HTTP/1.1
Accept: text/xml
Accept: multipart/*
Accept: application/soap
Content-Length: 463
Content-Type: text/xml; charset=utf-8
SOAPAction: http://tempuri.org/Test

<?xml version="1.0" encoding="UTF-8"?><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" soa
p:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><Test xmlns="http://tempuri.org/"><cCadenda xsi:type="xsd:string">HOLA</cCadenda></
Test></soap:Body></soap:Envelope>
SOAP::Transport::HTTP::Client::send_receive: HTTP/1.1 200 OK
Cache-Control: private, max-age=0
Connection: close
Date: Wed, 13 Aug 2008 19:12:16 GMT
Server: Microsoft-IIS/5.0
Content-Length: 359
Content-Type: text/xml; charset=utf-8
Client-Date: Wed, 13 Aug 2008 19:09:41 GMT
Client-Peer: 10.22.140.3:80
Client-Response-Num: 1
X-AspNet-Version: 2.0.50727
X-Powered-By: ASP.NET

<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:
Body><TestResponse xmlns="http://tempuri.org/"><TestResult>Item Aceptado: </TestResult></TestResponse></soap:Body></soap:Envelope>


En la parte que dice "Item Aceptado: " al final debe aparecer la cadena enviada y no sucede así. Alguien podría orientarme qué me está fallando.

NOTA: El consumo del Web Service desde otra plataforma sí tiene resultados; la cuestión es que tiene que realizarse a través de Perl.

Agradezco de antemano el apoyo brindado.

Saludos.
sergioc
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2008-08-13 16:25 @725

Publicidad

Notapor explorer » 2008-08-13 18:01 @792

Bienvenido a los foros de Perl en Español, sergioc.

En estos foros hay algunos hilos sobre el tema se SOAP::Lite. Usa el sistema de búsqueda.

Yo... me voy a arriesgar en la respuesta...

Si estás obligado a usar un Web Service .Net (Díos, qué peligro), quizás debas incluir la línea

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$SOAP::Constants::DO_NOT_USE_CHARSET = 1;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

al principio del script, como comento en este hilo.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

SOAP::Lite

Notapor sergioc » 2008-08-13 19:10 @840

Explorer, agradezco tu respuesta. En efecto, he seguido algunos hilos de información y un sin fin de ejemplos cambiando varios factores incluyendo la línea de código que me indicas pero la respuesta sigue siendo la misma.

Ahora he notado lo siguiente, no soy realmente un experto en Perl pero he hecho algunos pinitos y creo que el asunto se encuentra en:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
-> on_action( sub { sprintf '%s%s', @_ } )
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


ya que si lo pongo así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
-> on_action( sub { sprintf '%s', @_ } )
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


me manda un error interno de servidor y si lo pongo como el primer ejemplo me dice OK.

No he podido digerir la secuencia real del llamado pero no creo estar muy errado.
sergioc
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2008-08-13 16:25 @725

Notapor explorer » 2008-08-13 19:34 @857

Pues no lo sé... sprintf() funciona igual que en el lenguaje C. La diferencia es que en Perl no pasará nada si el array @_ tiene más valores que argumentos necesite sprintf().

Sería interesante saber cuál es ese error interno.

Fíjate también en el hilo que te dije, ya que en vez de sprintf() uso join(), así es independiente del número de argumentos que tenga @_, pues los pintamos todos.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

SOAP::Lite

Notapor sergioc » 2008-08-13 19:45 @864

Mi estimado Explorer, me creerás que también he probado con:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
-> on_action( sub { join '', @_ } );
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


y también obtengo lo mismo. La verdad, está bastante raro ya que desde otra plataforma de desarrollo con su sintaxis correspondiente regresa el valor correcto.

Así que creo que es parte de la sintaxis de Perl. Sin embargo, no logro encontrar el punto principal.
sergioc
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2008-08-13 16:25 @725

Notapor explorer » 2008-08-13 21:35 @940

Aquí también lo pasamos muy mal con el hilo aquel del servicio web de los puertos mexicanos, pero al final se resolvió cuando activamos las excepciones por ser servidores Microsoft (se inventan su sistema de envío de caracteres) y acertar con la peculiar sintaxis de SOAP::Lite.

Yo, como no tengo experiencia en estos temas, lo que hago es mirar con lupa lo que sucede, entre el cliente y el servidor. Desde Perl, uso Data::Dumper siempre que quiero saber qué aspecto tienen las estructuras devueltas. Y desde el sistema, miro el tráfico entre las máquinas, con tcpdump.

Importante también es mirar la documentación, y empezar usando los ejemplos que trae.

Ya te digo: yo aún no he tenido que meterme en el tema de los Web Services, pero con la documentación y las herramientas disponibles, pude resolver el tema.

Yo, lo que intentaría, es intentar, desde Perl, generar una petición exacta a la que se genera desde la otra plataforma, para asegurarme que es exactamente la misma. Si lo consigo, entonces el siguiente paso es averiguar porqué la recogida de la respuesta falla. Analizaría la respuesta para ver si es que tengo toda la respuesta. Si es así, es que SOAP::Lite o Perl no es capaz de traducir o leer esa respuesta a las estructuras que estamos esperando. Y finalmente, ver porqué.

En estos casos... Data::Dumper es nuestro amigo.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

SOAP::Lite

Notapor sergioc » 2008-08-16 13:30 @604

Mi estimado Explorer, una pregunta, para estos casos de consumo de Web Services, para otras plataformas su declaración para instanciar y consumirlos debe ser:

http://ruta/servicio.asmx?wsdl

y en Perl solamente se pone:

http://ruta/servicio.asmx

¿En qué parte de SOAP::Lite debe declararse el "wsdl"? Esto te lo pregunto ya que he hecho un rastreo con sniffer y otras herramientas y veo que se genera más código cuando se manda con "wsdl".
sergioc
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2008-08-13 16:25 @725

Notapor explorer » 2008-08-16 13:43 @613

Pues viendo el programa del hilo anterior, en el atributo proxy.

No sé... tendría que revisar la documentación de SOAP::Lite, y ahora estoy ocupadísimo.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Intermedio

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 30 invitados