• Publicidad

Cliente webservice en Perl

¿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.

Cliente webservice en Perl

Notapor luisbal » 2011-09-18 12:36 @567

Por favor, les agradeceré una ayuda.

Debo conectarme a un webservice y solo tengo estos datos. Me han alcanzado un manual y todo parece indicar que es sencillo, pero requiero una ayuda inicial. ¿Cómo llamo al webservice con un script Perl? Solo tengo esto, ¿es suficiente?

(los datos son solo supuestos)
URL de acceso a servicio: http://test.dominio.com/wsdl/autor.wsdl

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
getAutores

parámetros entrada
IdComercio
IdAutor

parámetros salida
Item
AutorID
AutorName
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Ademas me alcanzaron (entorno de producción) un usuario y un password, digamos:
usuario: xxx
pass: 222

¿Podrían ayudarme? Muchas gracias
luisbal
Perlero nuevo
Perlero nuevo
 
Mensajes: 20
Registrado: 2008-09-12 09:36 @442

Publicidad

Re: Cliente webservice en Perl

Notapor explorer » 2011-09-18 17:10 @757

Hay algunos hilos al respecto, con ejemplos.

Usa el sistema de búsqueda. Busca por 'WSDL'.

Te saldrán hilos como este: Cliente Perl consumiendo servicio Java usando WSDL.
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

Re: Cliente webservice en Perl

Notapor luisbal » 2011-09-21 22:53 @995

Gracias por la respuesta:
Yo he llegado hasta esto:

#!/usr/bin/perl

my $idcomercio=xxx;
my $IDautor=""; #este parámetro de entrada es opcional

use SOAP::Lite; +trace => 'debug';
$service = SOAP::Lite
-> uri("http://ws.leer-e.es")
-> proxy("http://ws.leer-e.es/wsdl/autor.wsdl");

$result = $service -> getAutores($idcomercio, "$IDautor") -> result;
print $result, "\n";

AL MENOS NO ME ARROJA ERROR... PERO ME APARECE UNA PÁGINA EN BLANCO. ¿Por qué?
¿Por favor, podrías ayudarme? ¿Hay algo de código más complejo que añadir? ¿Hay algo que me falta saber del webservice?
luisbal
Perlero nuevo
Perlero nuevo
 
Mensajes: 20
Registrado: 2008-09-12 09:36 @442

Re: Cliente webservice en Perl

Notapor explorer » 2011-09-22 05:01 @251

¿Página en blanco? ¿A qué te refieres? ¿A que lo estás ejecutando desde un navegador web? ¿O que no sale nada si lo ejecutas desde la línea de comandos?

P.D. Del código que has puesto, creo que sobra un ->result, al final.
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

Re: Cliente webservice en Perl

Notapor luisbal » 2011-09-22 07:53 @370

Gracias por tu respuesta, explorer. En efecto, el script lo estoy probando directamente en mi espacio web, desde un navegador. Cuando lo ejecuto, solo aparece una página en blanco como respuesta.

No tengo la menor idea si al menos logra la conexión o no, porque no me sale ningún error.
a lo mejor me he enredado en el uri y el proxy, que no entiendo bien cuál es cuál.
luisbal
Perlero nuevo
Perlero nuevo
 
Mensajes: 20
Registrado: 2008-09-12 09:36 @442

Re: Cliente webservice en Perl

Notapor explorer » 2011-09-22 12:45 @573

A ver... ¿has probado a ejecutarlo desde la línea de comandos?

Si lo quieres ejecutar desde un navegador, el navegador está esperando una cabecera HTTP estándar. Eso quiere decir que, antes de sacar el resultado, debes enviar una línea con una cabecera MIME como esta:

Content-Type: text/html

seguida de una línea en blanco, y seguida de un código HTML.

Si el resultado que esperas no es HTML, sino, por ejemplo, texto, tienes que poner esta cabecera:

Content-Type: text/plain

Tu programa quedaría así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. my $idcomercio = 'xxx';
  4. my $IDautor    = "";    # este parámetro de entrada es opcional
  5.  
  6. use SOAP::Lite
  7.     +trace   => 'debug'
  8.     ;
  9.  
  10. $service = SOAP::Lite
  11.         -> uri("http://ws.leer-e.es")
  12.         -> proxy("http://ws.leer-e.es/wsdl/autor.wsdl")
  13.          ;
  14.  
  15. $result = $service -> getAutores($idcomercio, $IDautor);
  16.  
  17. print "Content-Type: text/plain\n\n";
  18.  
  19. print $result, "\n";
  20.  
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4
(He quitado el ->result de la línea 15 y un ';' más arriba, de la 6.)
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

Re: Cliente webservice en Perl

Notapor luisbal » 2011-09-22 16:21 @723

Gracias otra vez, explorer. Seguí todas tus sugerencias y agregué la cabecera... ahora me aparece como todo resultado:


1

(el número uno, y nada más).

¿Estoy cerca? ¿Qué significa 1? Se supone que debería darme un listado de autores. A propósito, ¿dónde ubico en este script los parámetros de salida (en este caso AutorID y AutorName)?
luisbal
Perlero nuevo
Perlero nuevo
 
Mensajes: 20
Registrado: 2008-09-12 09:36 @442

Re: Cliente webservice en Perl

Notapor explorer » 2011-09-22 17:32 @772

Con la opción 'trace' debería haber salido el trazado de la ejecución. ¿Dónde está?

Te aconsejo que mires en los registros de actividad del servidor web (los ficheros log).

Yo, la verdad, ejecutaría este programa desde la línea de comandos, en lugar de usar un navegador web, al menos mientras lo desarrollas.

El '1' es una buena señal: nos ha devuelto algo, pero no sabemos qué es. Eso depende de la documentación.

También podría ser que ese '1' representase que nos ha devuelto un array con un único valor.

No sé decirte si el resultado es escalar o lista, porque eso depende de lo que diga la documentación.

Si dices que tiene que devolver un listado de autores, entonces me inclino a pensar que sí, que se trata de un arreglo.

Cambia la línea 15 por
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. @result = $service -> getAutores($idcomercio, $IDautor);
  2. use Data::Dumper;
  3. print Dumper \@result;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
a ver qué sale...
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

Re: Cliente webservice en Perl

Notapor luisbal » 2011-09-22 19:33 @856

Parece que la luz está cerca... ha aparecido un extensísimo resultado, que la verdad no sé qué es.

Te lo adjunto en otra respuesta. La documentación en efecto dice que los parámetros de salida son del tipo array (y podría ser UN resultado, pienso, ya que se trata de un servicio de prueba).

La documentación tal cual dice:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
parámetros de salida
tipo         descripción
array        matriz con los identificadores de los autores que cumplen los filtros
             Item
               AutorID
               AutorName
            ...
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Finalmente este es el script usado:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. $id = "64";
  3. $idautor = "";
  4.  
  5. use SOAP::Lite +trace => 'debug';
  6. $service = SOAP::Lite          
  7.      -> uri("http://ws.leer-e.es/wsdl/")
  8.      -> proxy("http://ws.leer-e.es/wsdl/autor.wsdl");
  9.  
  10. @result = $service -> getAutores($idcomercio, $idautor);
  11. use Data::Dumper;
  12.  
  13. print "Content-Type: text/plain\n\n";
  14. print Dumper \@result;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Y EL RESULTADO ARROJADO ES (mejor lo envío en un archivo aparte):

La pregunta es: ¿Y ahora? ¿cómo se traduce eso en un resultado?
Adjuntos
resultado.txt
resultado de la llamada
(76.63 KiB) 193 veces
luisbal
Perlero nuevo
Perlero nuevo
 
Mensajes: 20
Registrado: 2008-09-12 09:36 @442

Re: Cliente webservice en Perl

Notapor explorer » 2011-09-22 21:03 @919

Tienes un error: en la línea 2 defines $id con el valor 64, pero luego no lo usas en ningún sitio. Y en la línea 10 estás usando $idcomercio, que no ha sido definido en ninguna parte.

Lo he probado y no me da ningún resultado. Quiero decir, que sí me ha respondido el webservice, pero sin resultados.

Con el '64', ¿qué valores deberían salir?

Con la opción trace, deberías ver en la salida estándar tanto la petición como la respuesta HTTP.

Y el churro que ves salir es el resultado del Dumper. Es el contenido de la respuesta que SOAP::Lite a confeccionado con lo que ha recibido del servidor.

En SOAP::SOM hay instrucciones para leer el contenido de la respuesta, pero el caso es que no veo ninguna respuesta:

Sintáxis: [ Descargar ] [ Ocultar ]
Using xml Syntax Highlighting
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <definitions targetNamespace="urn:Leere"
  3. xmlns:tns="urn:Leere"
  4. xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  5. xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
  6. xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
  7. xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
  8. xmlns="http://schemas.xmlsoap.org/wsdl/">
  9.  
  10. <types>
  11.     <xsd:schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:Leere">
  12.         <!-- getAutores -->
  13.         <xsd:complexType name="getAutoresParams">
  14.             <xsd:all>
  15.                 <xsd:element name="IdComercio" type="xsd:int" />
  16.                 <xsd:element name="IdEditorial" type="xsd:int" />
  17.             </xsd:all>
  18.         </xsd:complexType>
  19.         <!-- getAutores -->
  20.         <xsd:element name="getAutoresRequest" type="tns:getAutoresParams"/>
  21.         <xsd:element name="getAutoresResponse" type="xsd:soap_enc_array"/>
  22.     </xsd:schema>
  23. </types>
  24. <!-- getAutores -->
  25. <message name="getAutores">
  26.     <part name="data" element="tns:getAutoresRequest"/>
  27. </message>
  28. <message name="getAutoresResponse">
  29.     <part name="data" element="tns:getAutoresResponse"/>
  30. </message>
  31.  
  32. <portType name="ServicePortType">
  33.     <!-- getAutores -->
  34.     <operation name="getAutores">
  35.         <documentation>getAutores</documentation>
  36.         <input message="tns:getAutores"/>
  37.         <output message="tns:getAutoresResponse"/>
  38.     </operation>
  39. </portType>
  40.  
  41. <binding name="ServiceBinding" type="tns:ServicePortType">
  42.     <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
  43.     <operation name="getAutores">
  44.         <soap:operation soapAction="urn:Leere#getAutores" style="rpc"/>
  45.             <input>
  46.                 <soap:body use="encoded" namespace="urn:Leere" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
  47.             </input>
  48.             <output>
  49.                 <soap:body use="encoded" namespace="urn:Leere" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
  50.             </output>
  51.     </operation>
  52. </binding>
  53.  
  54. <service name="Service">
  55.     <port name="ProveedorSoap" binding="tns:ServiceBinding">
  56.         <soap:address location="http://ws.leer-e.es/index.php/webservices/autor" />
  57.     </port>
  58. </service>
  59.  
  60. </definitions>
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Devuelve un XML con 'definiciones', no con la respuesta. Y fíjate que dice que la pregunta sobre getAutores tiene dos argumentos: IdComercio e IdEditorial. ¿La documentación está bien?
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

Siguiente

Volver a Intermedio

¿Quién está conectado?

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