Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 
Índice general » Mundo Perl » Intermedio » Cliente webservice en Perl Responder al tema
Nuevo tema


Página 1 de 2  [ 16 mensajes ]  Ir a página 1, 2  Siguiente
 
Nota 2011-09-18 12:36 @567

Perlero Nuevo
Registrado: 2008-09-12 09:36 @442
Mensajes: 16
Cliente webservice en Perl
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

Syntax: [ Download ] [ Hide ]
Using text Syntax Highlighting
getAutores

parámetros entrada
IdComercio
IdAutor

parámetros salida
Item
AutorID
AutorName


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

¿Podrían ayudarme? Muchas gracias


Nota 2011-09-18 17:10 @757
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10249
Re: Cliente webservice en Perl
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


Nota 2011-09-21 22:53 @995

Perlero Nuevo
Registrado: 2008-09-12 09:36 @442
Mensajes: 16
Re: Cliente webservice en Perl
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?


Nota 2011-09-22 05:01 @251
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10249
Re: Cliente webservice en Perl
¿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


Nota 2011-09-22 07:53 @370

Perlero Nuevo
Registrado: 2008-09-12 09:36 @442
Mensajes: 16
Re: Cliente webservice en Perl
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.


Nota 2011-09-22 12:45 @573
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10249
Re: Cliente webservice en Perl
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í:
Syntax: [ Download ] [ Hide ]
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.  
(He quitado el ->result de la línea 15 y un ';' más arriba, de la 6.)

_________________
JF^D Perl programming


Nota 2011-09-22 16:21 @723

Perlero Nuevo
Registrado: 2008-09-12 09:36 @442
Mensajes: 16
Re: Cliente webservice en Perl
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)?


Nota 2011-09-22 17:32 @772
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10249
Re: Cliente webservice en Perl
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
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. @result = $service -> getAutores($idcomercio, $IDautor);
  2. use Data::Dumper;
  3. print Dumper \@result;
a ver qué sale...

_________________
JF^D Perl programming


Nota 2011-09-22 19:33 @856

Perlero Nuevo
Registrado: 2008-09-12 09:36 @442
Mensajes: 16
Re: Cliente webservice en Perl
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:

Syntax: [ Download ] [ Hide ]
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
            ...


Finalmente este es el script usado:
Syntax: [ Download ] [ Hide ]
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;


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:
Comentario: resultado de la llamada
resultado.txt [76.63 KiB]
14 veces
Nota 2011-09-22 21:03 @919
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10249
Re: Cliente webservice en Perl
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:

Syntax: [ Download ] [ Hide ]
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>

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


Nota 2011-09-23 09:14 @426

Perlero Nuevo
Registrado: 2008-09-12 09:36 @442
Mensajes: 16
Re: Cliente webservice en Perl
Es verdad, me equivoque en el código: el $id que puse en realidad es $idcomercio.

$idcomercio, en este caso 64, es el código que me identifica o autentifica ante el server (además que ellos tienen registrado ya mi IP).

He hecho la prueba nuevamente pero aparece la misma respuesta extensa. ¿Qué puede ser?


Nota 2011-09-23 09:30 @438
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10249
Re: Cliente webservice en Perl
Ni idea. Yo veo que responde, pero no veo resultados. Bueno, quizás porque mi IP no está registrada :)

Tendrás que ponerte en contacto con su administrador, y remitirle el resultado del 'trace' (no el resultado que sale con el Dumper), para que vea que la petición que haces al servidor sea correcta.

_________________
JF^D Perl programming


Nota 2011-09-23 12:10 @548

Perlero Nuevo
Registrado: 2008-09-12 09:36 @442
Mensajes: 16
Re: Cliente webservice en Perl
Muchas gracias por todo, explorer. Ok, le enviaré el trace... pero una última ayuda en este punto: ¿cuál es el trace? Si lo que sale es el Dumper... ¿Cómo hago para obtener el trace? Se trata del código anterior xml que has pegado en tu post?

Gracias otra vez, este foro es de lo mejor que hay.


Nota 2011-09-23 16:35 @732
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10249
Re: Cliente webservice en Perl
La salida del 'debug' gracias al 'trace' es lo que sale a través de la salida estándar (y error estándar).

Si estás ejecutando el programa desde la línea de comandos, es la salida que contiene las cabeceras HTTP, de envío y respuesta del servidor.

Si dejas comentada la línea del Dumper (o la borras), entonces lo verás claramente.

Si ejecutas el programa desde un navegador web, es más complicado, porque esa salida estará en el(los) fichero(s) log del servidor web.

_________________
JF^D Perl programming


Nota 2011-09-27 18:14 @801

Perlero Nuevo
Registrado: 2008-09-12 09:36 @442
Mensajes: 16
Re: Cliente webservice en Perl
Hola, estimado explorer: estuve trasteando el fin de semana revisando códigos y, aunque no consigo una respuesta válida, al menos el Dumper ya me da algún indicio:

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
$VAR1 = \[
            {
              'Error' => {
                         'text' => 'El parametro IdComercio es obligatorio.',
                         'code' => '1'
                       }
            }
          ];


EL PROBLEMA es que no sé por qué me dice eso, cuando el IdComercio lo he especificado. Aquí el script:

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. $idcomercio = "64";
  3. $ideditorial = ""; #opcional
  4.  
  5. use SOAP::Lite +trace => 'debug';
  6. use Data::Dumper;
  7.  
  8. $service = SOAP::Lite
  9.    -> uri("http://ws.leer-e.es")
  10.    -> service("http://ws.leer-e.es/wsdl/editorial.wsdl"); # me dijeron use service en vez de proxy
  11.    
  12.  my $param1 = SOAP::Data->name('IdComercio')->value('$idcomercio')->type('int');
  13.  my $param2 = SOAP::Data->name('IdEditorial')->value('$ideditorial')->type('int');
  14.  
  15.  my $result = $service->getEditoriales(
  16.      $param1,
  17.      $param2,
  18.      );
  19.  
  20. print "Content-Type: text/plain\n\n";
  21.  
  22. print $result; #el print $result me arroja "ARRAY(0x9188de4)"
  23. print Dumper \$result;


¿Alguna solución?
gracias


Responder al tema  [ 16 mensajes ]  Ir a página 1, 2  Siguiente

Reglas del Foro
No puedes abrir nuevos temas en este Foro
No puedes responder a temas en este Foro
No puedes editar tus mensajes en este Foro
No puedes borrar tus mensajes en este Foro
No puedes enviar adjuntos en este Foro

Publicidad

Socializa

Síguenos por Twitter

Suscríbete GRATUITAMENTE al Boletín de Perl en Español

Saltar a:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Traducción al español por Huan Manwë para phpbb-es.com
phpBB SEO