Página 1 de 4

Cliente Perl consumiendo servicio Java usando WSDL

NotaPublicado: 2011-05-27 18:39 @818
por scout
Dándole vuelta a la tuerca, ahora estoy intentando de conectar un cliente Perl como el siguiente con un servicio web Java probado con un cliente Java y funcionando. El servicio Java crea automáticamente el archivo WSDL, así que asumimos que lo crea correctamente y lo probamos con un cliente Java ( que no viene al caso ya que la idea es probar el Perl como cliente, pero confirmo que funciona bien ) :

Cliente Perl:

use SOAP::Lite +trace => [qw(debug)];
my $result ;
print "Connecting to Hello Service...\n";
my $client = SOAP::Lite->service( 'http://localhost:8080/primerawebenjava/NewWebService?WSDL');
print $result = $client->nombre();


La función es “nombre” .
A simple vista el cliente Perl no da más respuesta, que “Connecting to Hello Service...
“; poniendo el debug da el siguiente detalle que no logro entender dónde está el problema… para realizar la interconexión.

Script Output :
Executing file : C:\clientehelloajava.pl

SOAP::Transport::HTTP::Client::send_receive: POST http://localhost:8080/primerawebenjava/NewWebService HTTP/1.1
Accept: text/xml
Accept: multipart/*
Accept: application/soap
Content-Length: 684
Content-Type: text/xml; charset=utf-8
SOAPAction: ""

<?xml version="1.0" encoding="UTF-8"?><soap:Envelope xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsp="http://www.w3.org/ns/ws-policy" soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:wsp1_2="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="http://primerservicio/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><tns:nombre xsi:nil="true" /></soap:Body></soap:Envelope>
SOAP::Transport::HTTP::Client::send_receive: HTTP/1.1 500 Internal Server Error
Connection: close
Date: Mon, 23 May 2011 07:45:50 GMT
Server: GlassFish Server Open Source Edition 3.1
Content-Type: text/xml;charset=utf-8
Client-Date: Mon, 23 May 2011 07:11:13 GMT
Client-Peer: 127.0.0.1:8080
Client-Response-Num: 1
Client-Transfer-Encoding: chunked
X-Powered-By: Servlet/3.0 JSP/2.2 (GlassFish Server Open Source Edition 3.1 Java/Sun Microsystems Inc./1.6)

<?xml version='1.0' encoding='UTF-8'?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><S:Fault xmlns:ns4="http://www.w3.org/2003/05/soap-envelope"><faultcode>S:VersionMismatch</faultcode><faultstring>Couldn't create SOAP message. Expecting Envelope in namespace http://schemas.xmlsoap.org/soap/envelope/, but got http://schemas.xmlsoap.org/wsdl/soap/ </faultstring></S:Fault></S:Body></S:Envelope>
Use of uninitialized value $result in print at C:\clientehelloajava.pl line 5.
Connecting to Hello Service...

Re: Cliente Perl consumiendo servicio Java usando WSDL

NotaPublicado: 2011-06-01 17:32 @772
por panterozo
Hola scout:

Checa aquí.. puse una solución distinta al final para .Net, sí

¡¡¡Saludos!!!

Re: Cliente Perl consumiendo servicio Java usando WSDL

NotaPublicado: 2011-06-02 00:44 @072
por scout
A ver... le daré una oportunidad más a Perl. De Perl a Perl va genial, todo se traba para crear el WSDL. Haciendo pruebas veo que los demás lenguajes lo arman automáticamente y en Perl no encontré la forma de crear un WSDL que se pueda leer... Gracias por responder. Si puedo avanzar en ello os pongo la solución o métodos realizados...

Re: Cliente Perl consumiendo servicio Java usando WSDL

NotaPublicado: 2011-06-02 02:27 @143
por scout
Panterazo, de pura curiosidad sobre pruebas realizadas, ¿has intentado crear el servicio desde Perl y tener un cliente en .NET ya sea C#, visual o el que te guste más?

Re: Cliente Perl consumiendo servicio Java usando WSDL

NotaPublicado: 2011-06-02 05:22 @265
por explorer
scout escribiste:todo se traba para crear el WSDL
¿No te han valido los otros módulos que te enlazamos en los otros hilos?

Yo tenía entendido que el WSDL era siempre el mismo a la hora de consumir un servicio web. Es decir: solo tenemos que generarlo una vez. Lo colocamos dentro de la cadena de ejecución, y el cliente y el servidor harán uso de él.

Aparte de WSDL::Generator (que todo el mundo está de acuerdo en que es muy pesado), otra opción para generarlo es, por ejemplo POD::WSDL. Solo tienes que crear la definición del WSDL en formato pod, pasarlo por el módulo, y ya tienes generado el WSDL. Luego, solo queda mover el WSDL al cliente y al servidor.

Lo bueno de este módulo, es que puedes tener definida toda la funcionalidad del servidor en un paquete Perl, y la propia documentación del paquete, en formato POD, es la que va a crear el WSDL.

Bueno, es otra forma de hacerlo...

Re: Cliente Perl consumiendo servicio Java usando WSDL

NotaPublicado: 2011-06-02 06:00 @291
por scout
Este hilo que planteo es un cliente Perl haciendo uso de un WSDL generado y funcionando en Java, pero haciendo uso del cliente propuesto, me da error 500, y la consulta era básicamente si alguno tuvo un problema similar o pudo consumir un servicio creado en Java.

La información de crear el WSDL en Perl con los módulos recomendados se utilizó en las otras pruebas que expuse en otros hilos. Con el módulo POD creé el archivo WSDL pero sin éxito, desde un cliente Java...

Revisaré estos días, nuevamente... desde cero... todos los casos.

Gracias por vuestras respuestas, mi objetivo hoy es diferente al inicial ya que ahora quiero aprender cómo servicios Perl con clientes en otros lenguajes y otros servicios en otros lenguajes con clientes Perl, utilizando WSDL, por eso voy planteando cada prueba realizada…


Cliente Perl:

use SOAP::Lite +trace => [qw(debug)];
my $result ;
print "Connecting to Hello Service...\n";
my $client = SOAP::Lite->service( 'http://localhost:8080/primerawebenjava/NewWebService?WSDL');
print $result = $client->nombre();

Re: Cliente Perl consumiendo servicio Java usando WSDL

NotaPublicado: 2011-06-08 18:18 @804
por panterozo
En efecto, al intentar crear el WSDL en Perl, queda ni más ni menos que $#//¡¿''¡... en fin...

Yo no me rindo con Perl, así que de todas formas generé mi WSDL, haciendo más pruebas que nunca, y leyendo más de lo que suponía para generarlo. Al final, funciona todo Ok...

Para probar el Web Service de Perl, utilicé soapUI-3.6.1 y le pedí a un amigo que probara desde Eclipse. Le doy a importar el WSDL, y me genera el cliente (Request) y la información de vuelta (Response)... Con soapUI, y leyendo un poco de Schema, logré realizar correctamente el WSDL.

Los primeros pasos para generar el WSDL fueron con Pod::WSDL.

Un ejemplo del servidor Perl...
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. package Servidor;
  2.  
  3. use Acciones;
  4. use SQLQueries;
  5.  
  6. =begin WSDL
  7.  
  8. _IN usuario $string Usuario a validar
  9. _IN password $string Clave Acceso
  10. _RETURN @string Informacion Total
  11.  
  12. =cut
  13.  
  14. sub InfoOnline{
  15.    my ($user,$pass) = @_;
  16.    return "Lo que vayamos a retornar";
  17. }
  18.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


y el script que lee este fichero y genera un WSDL:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.   use Pod::WSDL;
  2.  
  3.   my $pod = new Pod::WSDL(source => './cgiserver.cgi',
  4.     location => 'http://localhost/Servidor',
  5.     pretty => 1,
  6.     withDocumentation => 1);
  7.  
  8.   print $pod->WSDL;
  9.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Ahora bien, el problema que me surgió a mi, que al comienzo, documento que se retorna un array de arrays, pero con Pod no lo pude solucionar. No quedaba otra de entrar a mano a cambiar el WSDL, y para esto hay que leer un poco más.

En la sección message del WSDL, cambié el type por tns1:Data...
Sintáxis: [ Descargar ] [ Ocultar ]
Using xml Syntax Highlighting
  1. <wsdl:message name="InfoOnlineResponse">
  2.   <wsdl:part name="InfoOnlineResult" type="tns1:Data">
  3.     <wsdl:documentation>Informacion Total</wsdl:documentation>
  4.   </wsdl:part>
  5. </wsdl:message>
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


... el cual tiene la información que retorno.

Sintáxis: [ Descargar ] [ Ocultar ]
Using xml Syntax Highlighting
  1. <wsdl:types>
  2.   <schema targetNamespace="http://localhost/Servidor" xmlns="http://www.w3.org/2001/XMLSchema">
  3.     <import namespace="http://schemas.xmlsoap.org/soap/encoding/" />
  4.     <complexType name="Data">
  5.       <sequence>
  6.         <element name="dato1" type="tns1:ArrayOfString" minOccurs="0"/>
  7.         <element name="dato2" type="tns1:ArrayOfString" minOccurs="0"/>
  8.         <element name="dato3" type="tns1:ArrayOfString" minOccurs="0"/>
  9.         <element name="dato4" type="tns1:ArrayOfString" minOccurs="0"/>
  10.       </sequence>
  11.     </complexType>
  12.     <complexType name="ArrayOfString">
  13.       <sequence>
  14.         <element minOccurs="4" maxOccurs="4" name="string" nillable="true" type="xsd:string"/>
  15.       </sequence>
  16.     </complexType>
  17.   </schema>
  18. </wsdl:types>
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


El envío es como...
Sintáxis: [ Descargar ] [ Ocultar ]
Using xml Syntax Highlighting
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <soap:Envelope xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tns1="http://localhost/Servidor" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  3. <soap:Body>
  4.   <tns1:InfoOnline>
  5.     <usuario xsi:type="xsd:string">panterozo</usuario>
  6.     <password xsi:type="xsd:string">panterozo</password>
  7.   </tns1:InfoOnline>
  8. </soap:Body>
  9. </soap:Envelope>
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Y el retorno
Sintáxis: [ Descargar ] [ Ocultar ]
Using xml Syntax Highlighting
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <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" soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  3. <soap:Body>
  4.   <InfoOnlineResponse xmlns="http://localhost/Servidor">
  5.     <InfoOnlineResult>
  6.       <dato1>
  7.         <string xsi:type="xsd:string">0</string>
  8.         <string xsi:type="xsd:string">0</string>
  9.         <string xsi:type="xsd:string">0</string>
  10.         <string xsi:type="xsd:string">0</string>
  11.       </dato1>
  12.       <dato2>
  13.         <string xsi:type="xsd:string">0</string>
  14.         <string xsi:type="xsd:string">0</string>
  15.         <string xsi:type="xsd:string">0</string>
  16.         <string xsi:type="xsd:string">0</string>
  17.       </dato2>
  18.       <dato3>
  19.         <string xsi:type="xsd:string">0</string>
  20.         <string xsi:type="xsd:string">0</string>
  21.         <string xsi:type="xsd:string">0</string>
  22.         <string xsi:type="xsd:string">0</string>
  23.       </dato3>
  24.       <dato4>
  25.         <string xsi:type="xsd:string">0</string>
  26.         <string xsi:type="xsd:string">0</string>
  27.         <string xsi:type="xsd:string">0</string>
  28.         <string xsi:type="xsd:string">0</string>
  29.       </dato4>
  30.     </InfoOnlineResult>
  31.   </InfoOnlineResponse>
  32. </soap:Body>
  33. </soap:Envelope>
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


y en la función "InfoOnline" vista más arriba, reemplazar "Lo que vayamos a retornar" por:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. return SOAP::Data->name(InfoOnlineResult =>
  2.            \SOAP::Data->value(
  3.                     SOAP::Data->name(data1
  4.                     => \SOAP::Data->value(
  5.                                 SOAP::Data->name(string=>0)->type('string'),
  6.                                 SOAP::Data->name(string=>0)->type('string'),
  7.                                 SOAP::Data->name(string=>0)->type('string'),
  8.                                 SOAP::Data->name(string=>0)->type('string')
  9.                                          )
  10.                                     ),
  11.                     SOAP::Data->name(data2
  12.                     => \SOAP::Data->value(
  13.                                 SOAP::Data->name(string=>0)->type('string'),
  14.                                 SOAP::Data->name(string=>0)->type('string'),
  15.                                 SOAP::Data->name(string=>0)->type('string'),
  16.                                 SOAP::Data->name(string=>0)->type('string')
  17.                                          )
  18.                                     ),
  19.                     SOAP::Data->name(data3
  20.                     => \SOAP::Data->value(
  21.                                 SOAP::Data->name(string=>0)->type('string'),
  22.                                 SOAP::Data->name(string=>0)->type('string'),
  23.                                 SOAP::Data->name(string=>0)->type('string'),
  24.                                 SOAP::Data->name(string=>0)->type('string')
  25.                                          )
  26.                                     ),
  27.                     SOAP::Data->name(data4
  28.                     => \SOAP::Data->value(
  29.                                 SOAP::Data->name(string=>0)->type('string'),
  30.                                 SOAP::Data->name(string=>0)->type('string'),
  31.                                 SOAP::Data->name(string=>0)->type('string'),
  32.                                 SOAP::Data->name(string=>0)->type('string')
  33.                                          )
  34.                                      )
  35.                              )
  36.                        );
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Hay que tomar en cuenta que para cualquier programa es una asaña generar el WSDL, así que sí o sí, con Perl me quedo.

Por más que traté, no logré hacer nada con WSDL::Generator, y no se lo recomiendo a nadie por el momento.

Espero esto le sea de utilidad a alguien más para que no se dé la lata que me di yo :s...

¡¡¡Saludos!!!

Re: Cliente Perl consumiendo servicio Java usando WSDL

NotaPublicado: 2011-06-09 01:08 @089
por scout
Veo que te lo curraste lindo... felicitaciones... había perdido la esperanza.

Por mi parte y para poder al menos comentar algo prefiero vivirlo así, que estuve haciendo las pruebas de generar y consumir servicios con Java y armar el WSDL del servicio o consumirlo o exportarlo son pocos clic. Es envidiable como va el NetBeans... pero obviamente a mi gusto Perl siempre me tira más... salvo para generar el WSDL...

Muy buena tu respuesta y estoy tratando de reproducirla... más o menos voy por el mismo lugar que estuve pero con tu cgi, el WSDL ya lo generé con el pod y la sección de message ya la incrusté a mano pero dime o muéstrame como te quedó a ti, por favor... con que vea una pequeña llama en mi mechero incendiaré ROMA... A mi el WSDL me quedo así... Poca diferencia pero necesito compararlo con el tuyo si puede ser.

<?xml version="1.0" encoding="UTF-8"?>
<!-- WSDL for http://localhost/Servidor created by Pod::WSDL version: 0.061 on Wed Jun 8 12:10:48 2011 -->
<wsdl:definitions targetNamespace="http://localhost/Servidor" xmlns:impl="http://localhost/Servidor" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns1="http://localhost/Servidor">

<wsdl:message name="InfoOnlineResponse">
<wsdl:part name="InfoOnlineResult" type="tns1:Data">
<wsdl:documentation>Informacion Total</wsdl:documentation>
</wsdl:part>
</wsdl:message>

<wsdl:portType name="ServidorHandler">
</wsdl:portType>

<wsdl:binding name="ServidorSoapBinding" type="impl:ServidorHandler">
<wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" />

</wsdl:binding>

<wsdl:service name="ServidorHandlerService">
<wsdl:port binding="impl:ServidorSoapBinding" name="Servidor">
<wsdlsoap:address location="http://localhost/Servidor" />
</wsdl:port>
</wsdl:service>

</wsdl:definitions>

Re: Cliente Perl consumiendo servicio Java usando WSDL

NotaPublicado: 2011-06-09 10:09 @464
por panterozo
Pos claro, Scout ;)...

Sintáxis: [ Descargar ] [ Ocultar ]
Using xml Syntax Highlighting
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- WSDL for http ://localhost/ created by Pod::WSDL version: 0.061 on Mon Jun  6 05:40:57 2011 -->
  3. <wsdl:definitions targetNamespace="http://localhost/Servidor" xmlns:impl="http://localhost/Servidor" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns1="http://localhost/Servidor">
  4.         <wsdl:types>
  5.                 <schema targetNamespace="http://localhost/Servidor" xmlns="http://www.w3.org/2001/XMLSchema">
  6.                     <import namespace="http://schemas.xmlsoap.org/soap/encoding/" />
  7.                 <complexType name="Data">
  8.                         <sequence>
  9.                         <element name="dato1" type="tns1:ArrayOfString" minOccurs="1"/>
  10.                         <!-- opcional, pero esto no lo maneja bien eclipse -->
  11.                         <element name="dato2" type="tns1:ArrayOfString" minOccurs="0"/>
  12.                         <!-- opcional, pero esto no lo maneja bien eclipse -->
  13.                         <element name="dato3" type="tns1:ArrayOfString" minOccurs="0"/>
  14.                         <!-- opcional, pero esto no lo maneja bien eclipse -->
  15.                         <element name="dato4" type="tns1:ArrayOfString" minOccurs="0"/>
  16.                     </sequence>
  17.                     </complexType>
  18.                     <complexType name="ArrayOfString">
  19.                             <sequence>
  20.                                         <!-- son 4 elementos string -->
  21.                                     <element minOccurs="4" maxOccurs="4" name="string" nillable="true" type="xsd:string"/>
  22.                             </sequence>
  23.                     </complexType>
  24.             </schema>
  25.         </wsdl:types>
  26.         <!-- Funcion Input -->
  27.         <wsdl:message name="InfoOnlineRequest">
  28.                 <wsdl:part name="usuario" type="xsd:string">
  29.                         <wsdl:documentation>Usuario</wsdl:documentation>
  30.                 </wsdl:part>
  31.                 <wsdl:part name="password" type="xsd:string">
  32.                         <wsdl:documentation>Clave Acceso</wsdl:documentation>
  33.                 </wsdl:part>
  34.         </wsdl:message>
  35.         <!-- datos en el retorno -->
  36.         <wsdl:message name="InfoOnlineResponse">
  37.                 <wsdl:part name="InfoOnlineResult" type="tns1:Data">
  38.                         <wsdl:documentation>Informacion Total</wsdl:documentation>
  39.                 </wsdl:part>
  40.         </wsdl:message>
  41.         <wsdl:portType name="ServidorHandler">
  42.                 <wsdl:operation name="InfoOnline" parameterOrder="usuario password rut dv">
  43.                         <!-- las funciones que hay que definir para el web service. INPUT y OUTPUT -->
  44.                         <wsdl:input message="impl:InfoOnlineRequest" name="InfoOnlineRequest" />
  45.                         <wsdl:output message="impl:InfoOnlineResponse" name="InfoOnlineResponse" />
  46.                 </wsdl:operation>
  47.         </wsdl:portType>
  48.         <wsdl:binding name="ServidorSoapBinding" type="impl:ServidorHandler">
  49.                 <wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" />
  50.                 <wsdl:operation name="InfoOnline">
  51.                         <wsdlsoap:operation soapAction="" />
  52.                         <wsdl:input name="InfoOnlineRequest">
  53.                                 <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://localhost/Servidor" use="encoded" />
  54.                         </wsdl:input>
  55.                         <wsdl:output name="InfoOnlineResponse">
  56.                                 <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://localhost/Servidor" use="encoded" />
  57.                         </wsdl:output>
  58.                 </wsdl:operation>
  59.         </wsdl:binding>
  60.         <wsdl:service name="ServidorHandlerService">
  61.                 <wsdl:port binding="impl:ServidorSoapBinding" name="Servidor">
  62.                         <!-- esta es la ruta directa al script del web service -->
  63.                         <wsdlsoap:address location="http://localhost/cgi-bin/cgiserver.cgi" />
  64.                 </wsdl:port>
  65.         </wsdl:service>
  66. </wsdl:definitions>
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Me gustaría poder probar un cliente web service en Netbeans... ¿tienes algún link donde se explique cómo hacer esto?

¡¡¡Vamos que se puede!!! xD

Re: Cliente Perl consumiendo servicio Java usando WSDL

NotaPublicado: 2011-06-09 10:43 @488
por scout
Lo probaré, a ver si puedo repetir lo que lograste... Mientras mira lo que te contaba sobre montar un servicio en Java: instala el Netbeans 7 y el glassfish-3.1 que es el servidor, no te interferirá con el Apache, trabaja en el 8080 si mal no recuerdo y sigue estas instrucciones... Tiene un vídeo más completo pero comienza con algo simple...

En las indicaciones te mostrará cómo probarlo directamente... Con ello te sacas de la duda de su funcionamiento... Y puedes exportar el WSDL... Pero obviamente la idea no es usar Java... Si no Perl... Míralo y cuéntame.

http://www.ooscarr.com/nerd/elblog/2008 ... web-en.php

Con esto te olvidas del WSDL y demás configuraciones que te traen dolores de cabeza, pudiendo focalizar en la lógica del servicio a brindar... que es la idea principal...