• Publicidad

Error 301 al testear Web Service 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.

Error 301 al testear Web Service en Perl

Notapor Skaraluk » 2013-05-03 16:19 @722

Estimados,

Me encuentro actualmente intentando crear un Web Service en Perl. Estoy usando para esto el paquete Pod::WSDL. A continuación pueden ver el código:

Sintáxis: (WebserviceFunctions.pm) [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. package WebserviceFunctions;
  2.  
  3. =begin WSDL
  4. _DOC Hello return a String saying hello
  5. _IN name $string the name of the user to salute
  6. _RETURN $string Returns a string Hello, name
  7. =end WSDL
  8.  
  9.  
  10. sub Hello {
  11.     my $name = shift;
  12.     my $return = "Hello, $name";
  13.     return $return;
  14. }
  15.  
  16. =begin WSDL
  17. _DOC Goodbye return a String saying goodbye
  18. _IN name $string the name of the user to dismiss
  19. _RETURN $string Returns a string Goodbye, name
  20. =end WSDL
  21.  
  22. sub Goodbye {
  23.     my $name = shift;
  24.     my $return = "Goodbye, $name";
  25.     return $return;
  26. }
  27.  
  28. 1;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Sintáxis: (webservice.cgi) [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2.  
  3. use Pod::WSDL;
  4. use CGI;
  5. use strict;
  6. use warnings;
  7.  
  8. print CGI->header('text/xml');
  9.  
  10. my $pod = new Pod::WSDL(source=> './WebserviceFunctions.pm',
  11.                         location=>'http://192.168.11.73/cgi-bin/webservice',
  12.                         pretty=>1,
  13.                         withDocumentation=>1);
  14.  
  15. $pod->addNamespace('http://192.168.11.73/cgi-bin/webservice/','WebserviceFunctions');
  16.  
  17. print $pod->WSDL;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Si entro directamente a la URL http://192.168.11.73/cgi-bin/webservice/webservice.cgi con mi navegador puedo ver perfectamente el código WSDL. Sin embargo, al intentar llamar el web service desde algún cliente tengo problemas.

Actualmente he intentado de dos formas, primero con un cliente en PHP (nusoap) el cual si bien se conecta al web service, al llamar un método éste le devuelve un NULL. De la segunda manera es con el web services Explorer de Eclipse, con el cual también puedo entrar al web service y ver sus métodos, pero al intentar llamar alguno de los métodos me devuelve el siguiente error:

IWAB0135E An unexpected error has occurred.
301
Moved Permanently


¿Alguien tiene alguna idea de qué se puede tratar esto? Los códigos que les he mostrado corresponden a ejemplos sacados de Internet y supuestamente deberían funcionar. Y por último, en caso de no encontrar solución, si me pueden guiar hacia otro módulo de Perl con el que pueda crear exitosamente un web service con salida a WSDL les estaría muy agradecido.

Saludos.
Avatar de Usuario
Skaraluk
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2013-05-03 15:56 @705

Publicidad

Re: Error 301 al testear Web Service en Perl

Notapor explorer » 2013-05-03 16:43 @738

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

Según pelpod, en la sección donde se explican las marcas "=begin", "=end" y "=for":

Note that there still must be a blank line after the "=begin" command and a blank line before the "=end" command

O sea: que debe existir (al menos) una línea en blanco después de la marca "=begin" y (al menos) otra línea en blanco delante de la marca "=end", por lo que deberías escribirlo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. package WebserviceFunctions;
  2.  
  3. =begin WSDL
  4.  
  5. _DOC Hello return a String saying hello
  6. _IN name $string the name of the user to salute
  7. _RETURN $string Returns a string Hello, name
  8.  
  9. =end WSDL
  10.  
  11.  
  12. sub Hello {
  13.     my $name = shift;
  14.     my $return = "Hello, $name";
  15.     return $return;
  16. }
  17.  
  18. =begin WSDL
  19.  
  20. _DOC Goodbye return a String saying goodbye
  21. _IN name $string the name of the user to dismiss
  22. _RETURN $string Returns a string Goodbye, name
  23.  
  24. =end WSDL
  25.  
  26. sub Goodbye {
  27.     my $name = shift;
  28.     my $return = "Goodbye, $name";
  29.     return $return;
  30. }
  31.  
  32. 1;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Mira este ejemplo que hay dentro de la carpeta de instalación del módulo Pod::WSDL.

Al final de la documentación de Pod::WSDL tienes referencias de otros tres módulos que también trabajan con WSDL.

Lo que no tengo claro es que necesites usar el módulo CGI... en toda la documentación del módulo no se dice nada de eso... salvo que solo quieras ver el código WSDL. Otra cosa es que quieras hacer funcionar el servicio web.

Vamos, este ejemplo es muy sencillo, y no aparece CGI por ningún lado.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Error 301 al testear Web Service en Perl

Notapor Skaraluk » 2013-05-06 11:52 @536

Gracias por la bienvenida, explorer.

Finalmente di con una solución que me funciona para lo que necesito. Dejé de lado el módulo Pod::WSDL y en cambio ocupé SOAP::Transport::HTTP.

Dejaré el código como muestra. En este momento puedo llamar a las funciones desde un proyecto Java y me retorna los valores sin problemas.

Sintáxis: (soap-cooltest.cgi) [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2.  
  3. use SOAP::Transport::HTTP;
  4. use MIME::Entity;
  5. use lib "/var/www/cgi-bin/webservice2/";
  6.  
  7. SOAP::Transport::HTTP::CGI->packager( SOAP::Packager::MIME->new )
  8.     ->dispatch_with( { 'urn:Webservice:HelloWorld' => 'HelloWorld' } )->handle;
  9.  
  10. BEGIN {
  11.  
  12.     package HelloWorld;
  13.     use vars qw(@ISA);
  14.     @ISA = qw(Exporter SOAP::Server::Parameters);
  15.     use SOAP::Lite;
  16.  
  17.     sub Hello {
  18.         my $self     = shift;
  19.         my $envelope = pop;
  20.         my $name     = $envelope->dataof("//Hello/name")->value;
  21.  
  22.         return SOAP::Data->name( 'resp' => "Hello, $name" );
  23.     }
  24.  
  25.     sub GoodBye {
  26.         my $self     = shift;
  27.         my $envelope = pop;
  28.         my $name     = $envelope->dataof("//GoodBye/name")->value;
  29.  
  30.         return SOAP::Data->name( 'resp' => "Goodbye, $name" );
  31.     }
  32. }
  33.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Dejando como punto de entrada http://192.168.11.73/cgi-bin/webservice2/soap-cooltest.cgi puedo acceder a los métodos desde mi proyecto.

¡Muchas gracias por la ayuda!
Última edición por explorer el 2013-05-06 13:08 @589, editado 1 vez en total
Razón: Formateado de código con Perltidy
Avatar de Usuario
Skaraluk
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2013-05-03 15:56 @705


Volver a Intermedio

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron