• Publicidad

Web Services con Perl SOAP-Lite

Así que programas sin strict y las expresiones regulares son otro modo de hablar. Aquí encontrarás respuestas de nivel avanzado, no recomendable para los débiles de corazón.

Web Services con Perl SOAP-Lite

Notapor programadorCO » 2018-04-02 08:45 @406

Hola. Estoy trabajando web services con SOAP::Lite. He venido trabajando web services con PHP 7 pero no me permite conexión a la base de datos de Informix, por ello estoy trabajando ahora con Perl. Realicé los pasos que están en algunos foros pero al generar el wsdl no me funciona. Estoy utilizando la librería WSDL::Generator pero no me ha funcionado, ¿qué puede estar sucediendo?

Este es el código que estoy utilizando para generar el WSDL.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/bin/perl
  2.  
  3. use WSDL::Generator;
  4. #use strict;
  5.  
  6. my $init = {
  7.  'schema_namesp' => 'http://192.168.XX.XX/extranet/webServices/wsLogin.xsd',
  8.  'services' => 'wsLogin',
  9.  'service_name' => 'wsLogin',
  10.  'target_namesp' => 'http://192.168.XX.XX/extranet/webServices',
  11.  'documentation' => 'Servicio Web de Prueba',
  12.  'location' => 'http://192.168.XX.XX/extranet/webServices'
  13. };
  14. my $wsdl = WSDL::Generator->new($init);
  15. wsLogin->consultarUsuario('12272');
  16. print $wsdl->get(wsLogin);
  17.  
  18.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
Avatar de Usuario
programadorCO
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2018-03-28 16:20 @722
Ubicación: Bogotá, Colombia

Publicidad

Re: Web Services con Perl SOAP-Lite

Notapor explorer » 2018-04-02 10:42 @487

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

Necesitamos pistas para saber qué pasa. Mira este hilo Consumo de WebService para activar el modo traza.

Por estos foros verás otros hilos con problemas y ejemplos con SOAP::Lite. Usa el sistema de búsqueda con la palabra "SOAP". Por ejemplo:
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: Web Services con Perl SOAP-Lite

Notapor programadorCO » 2018-04-02 10:59 @499

explorer. Gracias por responder.

Estos son los scripts y resultado al realizar la activación.

Script hibye.cgi
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!perl -w
  2.  
  3. use SOAP::Transport::HTTP;
  4.  
  5. SOAP::Transport::HTTP::CGI  
  6.         -> dispatch_to('Demo')    
  7.         -> handle;
  8.  
  9. package Demo;
  10.  
  11. sub hi {                    
  12.         return "hello, world";    
  13. }
  14.  
  15. sub bye {                    
  16.         return "goodbye, cruel world";
  17. }
  18.  
  19. ###########!/usr/bin/perl
  20. ##########use SOAP::Transport::HTTP;
  21. ##########SOAP::Transport::HTTP::CGI
  22. ##########  ->dispatch_to('C2FService')
  23. ##########  ->handle;
  24. ##########BEGIN {
  25. ##########  package C2FService;
  26. ##########  use vars qw(@ISA);
  27. ##########  @ISA = qw(Exporter SOAP::Server::Parameters);
  28. ##########  use SOAP::Lite;
  29. ##########  sub c2f {
  30. ##########      my $self = shift;
  31. ##########      my $envelope = pop;
  32. ##########      my $temp = $envelope->dataof("//c2f/temperature");
  33. ##########      return SOAP::Data->name('convertedTemp' => (((9/5)*($temp->value)) + 32));
  34. ##########  }
  35. ##########}
  36.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Este es el script 'hibye.pl' que llama a hibye.cgi

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!perl -w
  2. use LWP::UserAgent;
  3. use LWP::Debug;
  4. use Data::Dumper;
  5. use SOAP::Lite;
  6.  
  7. #my $ua = LWP::UserAgent->new;
  8.  
  9. #sub LWP::UserAgent::get_basic_credentials {
  10.     #warn "@_\n";
  11. #} #PARPA CONOCER EL REALM
  12.  
  13. our $sp_endpoint = 'http://192.168.xx.xx:80/pruebas2/WebService/hibye.cgi';
  14. our $sp_domain = '192.168.xx.xx:80';
  15. our $sp_username = 'XXXXXXX';
  16. our $sp_password = 'XXXXX';
  17.  
  18. $debug = 1;
  19.  
  20. if ($debug) {
  21.     LWP::Debug::level('+');
  22.     SOAP::Lite->import(+trace => 'all');
  23. }
  24.  
  25. my @ua_args = (keep_alive => 1);
  26. my @credentials = ($sp_domain, "Server realm", $sp_username, $sp_password);
  27. my $schema_ua = LWP::UserAgent->new(@ua_args);
  28.  
  29. $schema_ua->credentials(@credentials);
  30. $soap = SOAP::Lite->proxy($sp_endpoint, @ua_args, credentials => \@credentials);
  31. $soap->schema->useragent($schema_ua);
  32. $soap->uri("http://192.168.XX.XX:80/pruebas2/WebService/");
  33.  
  34. $soap->default_ns('urn:HelloWorld');
  35. my $som = $soap->call('hi', 'Kutter', 'Martin');
  36.     die $som->faultstring if ($som->fault);
  37. print $som->result, "\n";
  38.  
  39.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Este es el resultado al ejecutar el script hibye.pl

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
SOAP::Transport::new: ()
SOAP::Serializer::new: ()
SOAP::Deserializer::new: ()
SOAP::Parser::new: ()
SOAP::Lite::new: ()
SOAP::Transport::HTTP::Client::new: ()
SOAP::Deserializer::new: ()
SOAP::Parser::new: ()
SOAP::Schema::new: ()
SOAP::Lite::call: ()
SOAP::Serializer::envelope: ()
SOAP::Serializer::envelope: hi Kutter Martin
SOAP::Data::new: ()
SOAP::Data::new: ()
SOAP::Data::new: ()
SOAP::Data::new: ()
SOAP::Data::new: ()
SOAP::Transport::HTTP::Client::send_receive: HTTP::Request=HASH(0x27aaa04)
SOAP::Transport::HTTP::Client::send_receive: POST http://192.168.xx.xx:80/prueba
s2/WebService/hibye.cgi HTTP/1.1
Accept: text/xml
Accept: multipart/*
Accept: application/soap
Content-Length: 501
Content-Type: text/xml; charset=utf-8
SOAPAction: "urn:HelloWorld#hi"

<?xml version="1.0" encoding="UTF-8"?><soap:Envelope soap:encodingStyle="http://
schemas.xmlsoap.org/soap/encoding/" xmlns:soap="http://schemas.xmlsoap.org/soap/
envelope/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="
http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-in
stance"><soap:Body><hi xmlns="urn:HelloWorld"><c-gensym3 xsi:type="xsd:string">K
utter</c-gensym3><c-gensym5 xsi:type="xsd:string">Martin</c-gensym5></hi></soap:
Body></soap:Envelope>
SOAP::Transport::HTTP::Client::send_receive: HTTP::Response=HASH(0x2af6594)
SOAP::Transport::HTTP::Client::send_receive: HTTP/1.1 200 OK
Connection: Keep-Alive
Date: Mon, 02 Apr 2018 15:55:31 GMT
Accept-Ranges: bytes
ETag: "0-1547-5ac2523d"
Server: SAMBAR
Content-Length: 871
Content-Type: text/plain
Last-Modified: Mon, 02 Apr 2018 15:54:37 GMT
Client-Date: Mon, 02 Apr 2018 15:55:31 GMT
Client-Peer: 192.168.xx.xx:80
Client-Response-Num: 1
Keep-Alive: max=50, timeout=25

#!perl -w

use SOAP::Transport::HTTP;

SOAP::Transport::HTTP::CGI
        -> dispatch_to('Demo')
        -> handle;

package Demo;

sub hi {
        return "hello, world";
}

sub bye {
        return "goodbye, cruel world";
}

###########!/usr/bin/perl
##########use SOAP::Transport::HTTP;
##########SOAP::Transport::HTTP::CGI
##########  ->dispatch_to('C2FService')
##########  ->handle;
##########BEGIN {
##########  package C2FService;
##########  use vars qw(@ISA);
##########  @ISA = qw(Exporter SOAP::Server::Parameters);
##########  use SOAP::Lite;
##########  sub c2f {
##########      my $self = shift;
##########      my $envelope = pop;
##########      my $temp = $envelope->dataof("//c2f/temperature");
##########      return SOAP::Data->name('convertedTemp' => (((9/5)*($temp->value
)) + 32));
##########  }
##########}
SOAP::Deserializer::deserialize: ()
SOAP::Parser::decode: ()

not well-formed (invalid token) at line 1, column 1, byte 1 at C:/Perl/lib/XML/P
arser.pm line 187
#!perl -w

use SOAP::Transport::HTTP;

SOAP::Transport::HTTP::CGI
        -> dispatch_to('Demo')
        -> handle;

package Demo;

sub hi {
        return "hello, world";
}

sub bye {
        return "goodbye, cruel world";
}

###########!/usr/bin/perl
##########use SOAP::Transport::HTTP;
##########SOAP::Transport::HTTP::CGI
##########  ->dispatch_to('C2FService')
##########  ->handle;
##########BEGIN {
##########  package C2FService;
##########  use vars qw(@ISA);
##########  @ISA = qw(Exporter SOAP::Server::Parameters);
##########  use SOAP::Lite;
##########  sub c2f {
##########      my $self = shift;
##########      my $envelope = pop;
##########      my $temp = $envelope->dataof("//c2f/temperature");
##########      return SOAP::Data->name('convertedTemp' => (((9/5)*($temp->value
)) + 32));
##########  }
##########} at hibye.pl line 38
SOAP::Data::DESTROY: ()
SOAP::Data::DESTROY: ()
SOAP::Data::DESTROY: ()
SOAP::Parser::DESTROY: ()
SOAP::Deserializer::DESTROY: ()
SOAP::Parser::DESTROY: ()
SOAP::Transport::DESTROY: ()
SOAP::Transport::HTTP::Client::DESTROY: ()
SOAP::Serializer::DESTROY: ()
SOAP::Data::DESTROY: ()
SOAP::Data::DESTROY: ()
SOAP::Deserializer::DESTROY: ()
SOAP::Schema::DESTROY: ()
SOAP::Lite::DESTROY: ()
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Avatar de Usuario
programadorCO
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2018-03-28 16:20 @722
Ubicación: Bogotá, Colombia

Re: Web Services con Perl SOAP-Lite

Notapor explorer » 2018-04-02 11:34 @523

En la respuesta veo que sale el mismo código fuente de hibye.cgi, así que el problema está en que el servidor web NO lo ha ejecutado, si no que lo devuelve como un archivo de texto normal y corriente.

Debes configurar el servidor HTTP para que ejecute los archivos .cgi

Lo normal será ponerlos en alguna carpeta llamada cgi-bin/ o similar. Y ya que estás en Windows, activarle el permiso de ejecución.
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: Web Services con Perl SOAP-Lite

Notapor programadorCO » 2018-04-02 17:09 @756

Pude generar el archivo wsdl del ejemplo del siguiente enlace.

http://gluc.unicauca.edu.co/index.php/Servicios_Web_con_Perl

pero al consumir el servicio me imprime el siguiente error
"Can't create daemon: Intento de acceso a un socket no permitido por sus permisos de acceso. at servidor.pl line 9"
Avatar de Usuario
programadorCO
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2018-03-28 16:20 @722
Ubicación: Bogotá, Colombia

Re: Web Services con Perl SOAP-Lite

Notapor explorer » 2018-04-02 19:15 @844

Necesitas permiso de supervisor para poder crear un proceso unido a número de socket inferior al 1024, ya que están reservados para los servicios del sistema.
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: Web Services con Perl SOAP-Lite

Notapor programadorCO » 2018-05-25 11:02 @501

Hola, explorer. Finalmente dejé el web service en PHP con llamada a un script de Perl. Sin embargo sí necesito crear los servicios con Perl. Te agradecería si me puedes guiar para la creación de los mismos.

Por otra parte necesito consumir un web service que está en .NET desde Perl con SOAP. Quisiera saber cómo puedo hacer el consumo.

Gracias.
Avatar de Usuario
programadorCO
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2018-03-28 16:20 @722
Ubicación: Bogotá, Colombia

Re: Web Services con Perl SOAP-Lite

Notapor explorer » 2018-05-25 11:44 @531

Yo cuando tengo que hacer algo de esto (la última vez, hace dos años), consulto la web http://web.archive.org/web/201609110323 ... te.com:80/

En concreto, el SOAP Cookbook: http://web.archive.org/web/201609161759 ... te.com:80/ ya que lo que necesito suele estar allí mismo.

Pero es documentación de hace diez años, así que al final lo que hago es consultar la propia página de manual de SOAP::Lite. Allí vienen consejos específicos para cuando tienes que pegarte con un servidor Micro$oft, que requieren un tratamiento especial.
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: Web Services con Perl SOAP-Lite

Notapor programadorCO » 2018-05-28 09:41 @445

Hola, explorer.

Consumí el servicio .NET con SOAP::LITE y funciona, le envío unos parámetros y me retorna una cadena. Al imprimirla en el navegador me salen los elementos separados como xml, dentro del código no he podido separar esos elementos para obtener el dato de cada uno, intento manejarlo como un hash pero no lo hace siempre me sale error, la línea que utilizo para el llamado del web services es
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $resultado = $soap->call($method => @parametros);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

y obtengo
Sintáxis: [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
  1. <respuesta><codigo>123</codigo><descripcion>ok</descripcion><token>456</token></respuesta>
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

¿Cómo puedo manipular estos datos individualmente ya que Perl solo ve los datos de los elementos como una cadena?

Esta prueba la hice con dumper() y me imprime;
$VAR1 = '123ok456'

Utilicé esta línea para obtener el valor del elemento pero no funciona.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $resultado ->valueof('//getTokenResponse/getTokenResult/respuesta/token');
  2.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Avatar de Usuario
programadorCO
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2018-03-28 16:20 @722
Ubicación: Bogotá, Colombia


Volver a Avanzado

¿Quién está conectado?

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

cron