• Publicidad

XML::Compile::WSDL

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

XML::Compile::WSDL

Notapor Lor » 2011-05-14 21:00 @916

Estoy utilizando este módulo para acceder como cliente a un web service. Todo anda correcto, la llamada al servicio y la devolución de los datos esperados como respuesta.
Recibo los datos(los veo en el log), pero no sé cómo accederlos a partir de la variable $response. No comprendo la estructura del hash devuelta.

El único inconveniente que se me presenta es con la respuesta recibida: pongo en practica los ejemplos que presenta el autor en el CPAN, pero no logro acceder a los datos devueltos.

Parte del código es:

my $wsdl = XML::Compile::WSDL11->new(wsdl/file.wsdl);
$wsdl->importDefinitions ('wsdl/xsd_LoginTicketResponse.xsd');

my $loginCms = $wsdl->compileClient ( 'loginCms' );

# Extraer y validar la información de autorización (TA)
#----------------------------------------------------------------------------
my ($response) = $loginCms->(in0 => $CMS);
die "Lookup for failed: $response->{Fault}{faultstring}\n" if $response->{Fault};

# El problema esta aquí: ¿Cómo obtengo los valores de <source>, <destination> ,... etc ?
my $headerType = $response->{'parameters'}{'headerType'};
print " $headerType->{source} ";
print " $headerType->{'destination'}";
print " $headerType->{'uniqueId'} )";

No logro leer el valor devuelto por el web service para source, destination, etc.

¡¡¡¡¡¡¡¡¡¡¡¡¡ Muchísimas gracias !!!!!!!!!!!!!


PARTE del wsdl/file.wsdl es

<schema elementFormDefault="qualified" targetNamespace="http://wsaa.view.sua.dvadac.desein.afip.gov" xmlns="http://www.w3.org/2001/XMLSchema">
<import namespace="https://wsaahomo.afip.gov.ar/ws/services/LoginCms"/>
<element name="loginCms">
<complexType>
<sequence>
<element name="in0" type="xsd:string"/>
</sequence>
</complexType>
</element>
<element name="loginCmsResponse">
<complexType>
<sequence>
<element name="loginCmsReturn" type="xsd:string"/>
</sequence>
</complexType>
</element>
</schema>
<schema elementFormDefault="qualified" targetNamespace="https://wsaahomo.afip.gov.ar/ws/services/LoginCms" xmlns="http://www.w3.org/2001/XMLSchema">
<complexType name="LoginFault">
<sequence/>
</complexType>
<element name="fault" type="impl:LoginFault"/>
</schema>
</wsdl:types>
<wsdl:message name="loginCmsRequest">
<wsdl:part element="tns1:loginCms" name="parameters"/>
</wsdl:message>
<wsdl:message name="LoginFault">
<wsdl:part element="impl:fault" name="fault"/>
</wsdl:message>
<wsdl:message name="loginCmsResponse">
<wsdl:part element="tns1:loginCmsResponse" name="parameters"/>
</wsdl:message>
<wsdl:portType name="LoginCMS">
<wsdl:operation name="loginCms">
<wsdl:input message="impl:loginCmsRequest" name="loginCmsRequest"/>
<wsdl:output message="impl:loginCmsResponse" name="loginCmsResponse"/>
<wsdl:fault message="impl:LoginFault" name="LoginFault"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="LoginCmsSoapBinding" type="impl:LoginCMS">
<wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="loginCms">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="loginCmsRequest">
<wsdlsoap:body use="literal"/>
</wsdl:input>
<wsdl:output name="loginCmsResponse">
<wsdlsoap:body use="literal"/>
</wsdl:output>
<wsdl:fault name="LoginFault">
<wsdlsoap:fault name="LoginFault" use="literal"/>
</wsdl:fault>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="LoginCMSService">
<wsdl:port binding="impl:LoginCmsSoapBinding" name="LoginCms">
<wsdlsoap:address location="https://wsaahomo.afip.gov.ar/ws/services/LoginCms"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>

PARTE del Schema

<xsd:element name="loginTicketResponse" type="loginTicketResponse" />
<xsd:complexType name="loginTicketResponse">
<xsd:sequence>
<xsd:element name="header" type="headerType" minOccurs="1" maxOccurs="1" />
<xsd:element name="credentials" type="credentialsType" minOccurs="1" maxOccurs="1" />
</xsd:sequence>
<xsd:attribute name="version" type="xsd:decimal" use="optional" default="1.0" />
</xsd:complexType>
<xsd:complexType name="headerType">
<xsd:sequence>
<xsd:element name="source" type="xsd:string" minOccurs="1" maxOccurs="1" />
<xsd:element name="destination" type="xsd:string" minOccurs="1" maxOccurs="1" />
<xsd:element name="uniqueId" type="xsd:unsignedInt" minOccurs="1" maxOccurs="1" />
<xsd:element name="generationTime" type="xsd:dateTime" minOccurs="1" maxOccurs="1" />
<xsd:element name="expirationTime" type="xsd:dateTime" minOccurs="1" maxOccurs="1" />
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="credentialsType">
<xsd:sequence>
<xsd:element name="token" type="xsd:string" minOccurs="1" maxOccurs="1" />
<xsd:element name="sign" type="xsd:string" minOccurs="1" maxOccurs="1" />
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
Lor
Perlero nuevo
Perlero nuevo
 
Mensajes: 187
Registrado: 2005-04-28 05:47 @282

Publicidad

Re: XML::Compile::WSDL

Notapor explorer » 2011-05-15 04:48 @242

Para estos casos, en lo que no sé el aspecto que tiene la estructura devuelta, es siempre aconsejable el uso de Data::Dumper:

use Data::Dumper;
print Dumper($response);

De esa manera, se desplegará toda la estructura de $response, y podré saber cómo está organizada.

Hay otras variantes de Data::Dumper, como Data::Dumper::Simple o Data::Dumper::Names, que muestran la misma información, pero un poco más clara.

Nota: Data::Dumper viene integrado en tu distribución de Perl.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: XML::Compile::WSDL

Notapor Lor » 2011-05-15 05:41 @278

:D ¡¡¡Muchas gracias!!! Aquí va lo que me devuelve el Dumper $response:

$VAR1 = [ { 'parameters' => { 'loginCmsReturn' => ' CN=wsaahomo, O=AIP, C=AR, SERIALNUMBER=CUIT 3361150239 C=ar, O=glut, SERIALNUMBER=CUIT 30599966, CN=wsfe_glu 2580755959 2011-05-15T07:26:45.877-03:00 2011-05-15T19:26:45.877-03:00 ++CiAgICAgICAgICAgICAgICA8cmVsYXRpb24gcmVsdHlwZT0iNCIga2V5PSIzMDUwMTk4NjE2NiIvPgogICAgICAgICAgICA8L3JlbGF0aW9ucz4KICAgICAgICA8L2xvZ2luPgogICAgPC9vcGVyYXRpb24+Cjwvc3NvPgoK mMP3gGHl4biqPzqDCigK52QDCoc0CTHLIDY8exkQeyMjc+qE+m6pvncrjcAv2ja48S9bRK+GjnoPkSaWvls1jxFj5kyrE2Zmz5CVyB8ueihvFEJMH2EabGtRC/0ZxOkNr2TuQF11H2wX9x5yCQeUck9LE5b3BZHJTrT8KK6ihLI= ' } } ];

Allí adentro aparecen el valor
<source>
<destination>
<uniqueid>
... que son los valores que quiero obtener, pero no sé cómo accederlos ya que por lo que se ve aparecen separados por Espacios y son devueltos todos juntos dentro de un string '......'.

Yo necesitaría obtener:
my $souce= CN=wsaahomo, O=AIP, C=AR, SERIALNUMBER=CUIT 3361150239
my $destination =C=ar, O=glut, SERIALNUMBER=CUIT 30599966, CN=wsfe_glu
my $uniqueid= 2580755959

y así sucesivamente

¡¡¡¡¡¡¡¡¡¡¡Muchísimas gracias!!!!!!!!!!!
Última edición por explorer el 2011-05-15 05:56 @289, editado 1 vez en total
Razón: Ortografía: admiraciones
Lor
Perlero nuevo
Perlero nuevo
 
Mensajes: 187
Registrado: 2005-04-28 05:47 @282

Re: XML::Compile::WSDL

Notapor explorer » 2011-05-15 06:25 @309

Pues si la información está dentro de una cadena de caracteres, habrá que extraerla...
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use Modern::Perl;                       # somos modernos
  3.  
  4. my $response = [
  5.     {
  6.         'parameters' => {
  7.             'loginCmsReturn' =>
  8.                   ' CN=wsaahomo, O=AIP, C=AR, SERIALNUMBER=CUIT 3361150239 C=ar,'
  9.                 . ' O=glut, SERIALNUMBER=CUIT 30599966, CN=wsfe_glu 2580755959'
  10.                 . ' 2011-05-15T07:26:45.877-03:00 2011-05-15T19:26:45.877-03:00'
  11.                 . ' ++CiAgICAgICAgICAgICAgICA8cmVsYXRpb24gcmVsdHlwZT0iNCIga2V5PS'
  12.                 . 'IzMDUwMTk4NjE2NiIvPgogICAgICAgICAgICA8L3JlbGF0aW9ucz4KICAgICA'
  13.                 . 'gICA8L2xvZ2luPgogICAgPC9vcGVyYXRpb24+Cjwvc3NvPgoK mMP3gGHl4bi'
  14.                 . 'qPzqDCigK52QDCoc0CTHLIDY8exkQeyMjc+qE+m6pvncrjcAv2ja48S9bRK+G'
  15.                 . 'jnoPkSaWvls1jxFj5kyrE2Zmz5CVyB8ueihvFEJMH2EabGtRC/0ZxOkNr2TuQ'
  16.                 . 'F11H2wX9x5yCQeUck9LE5b3BZHJTrT8KK6ihLI= ',
  17.         }
  18.     }
  19. ];
  20.  
  21. my $respuesta = $response->[0]->{'parameters'}->{'loginCmsReturn'};
  22.  
  23. my($source, $destination, $uniqueid) = $respuesta =~ m/(CN=.+? SERIALNUMBER=.+?) (C=.+? CN=\S+) (\d+)/;
  24.  
  25. say "[$source]";
  26. say "[$destination]";
  27. say "[$uniqueid]";
  28.  
  29. __END__
  30. [CN=wsaahomo, O=AIP, C=AR, SERIALNUMBER=CUIT 3361150239]
  31. [C=ar, O=glut, SERIALNUMBER=CUIT 30599966, CN=wsfe_glu]
  32. [2580755959]
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Web service

Notapor Lor » 2011-05-21 18:28 @811

Un web service me está devolviendo un conjunto de datos (origen, destino, id, fecha_inicio, fecha_fin, token, firma), TODOS dentro de una misma cadena SEPARADOS por UN ESPACIO en blanco; cada dato dentro de la misma. Agradecería muchísimo me ayudasen a poder asignar a cada variable 'la porción de datos devueltos que le corresponde'.

La cadena devuelta es la siguiente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $cadena_devuelta =' CN=womo, O=AFIP, C=AR, SERIALNUMBER=CUIT 4440239  C=ar, O=glusa, SERIALNUMBER=CUIT 3057779166, CN=ws_glsa  2220949157  2011-05-16T13:21:59.101-03:00  2011-05-17T01:21:59.101-03:00  lbm2xvogICAgPC9vcGVyYXRpb24+Cjwvc3NvPgoK
  2.  E8Q8uNfElSLGBIFzDW+YbffXBWH5sYmScgDF7/aAfla3aZ0Fvh5zvnKSkjZ4= ';
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


donde debería lograr poder asignar a cada variable las SIGUIENTES PORCIONES de la cadena devuelta:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my  $source= 'CN=womo, O=AFIP, C=AR, SERIALNUMBER=CUIT 4440239';
  2. my $destino = 'C=ar, O=glusa, SERIALNUMBER=CUIT 3057779166, CN=ws_glsa';
  3. my $id = 2220949157;
  4. my $fecha_inicio=  '2011-05-16T13:21:59.101-03:00';
  5. my $fecha_fin = '2011-06-19T08:22:59.101-03:00';
  6. my $token = 'S4wIiBlbm2xvogICAgPC9vcGVyYXRpb24+Cjwvc3NvPgoK';
  7. my $token2= 'E8Q8uNfElSLGBIFzDW+YbffXBWH5sYmScgDF7/aAfla3aZ0Fvh5zvnKSkjZ4=';
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Tener en cuenta que $source y $destino tienen varios espacios en blanco dentro de su composición, por lo que no puedo usar split(' ', $cadena_devuelta).

$touken y $touken2 son una secuencia aleatoria de caracteres que varía, y cuya longitud no es fija, PERO donde aquí sí la separación entre $token y $token2 está dada por un espacio en blanco.

¡¡¡ Muchas gracias por su ayuda !!! :D :D :D
Última edición por explorer el 2011-05-21 18:42 @821, editado 1 vez en total
Razón: Ortografía, bloques de código
Lor
Perlero nuevo
Perlero nuevo
 
Mensajes: 187
Registrado: 2005-04-28 05:47 @282

Extracción de datos de una cadena.

Notapor Lor » 2011-05-22 16:54 @746

:oops: (Espero después de ésta no molestar por un tiempo)

Tengo la siguiente cadena:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $respuesta = ' CN=wsaahomo, O=AIP, C=AR, SERIALNUMBER=CUIT 37878239 C=ar,'
  2.         . ' O=glut, SERIALNUMBER=CUIT 3059446, CN=wsfe_glu 2580755959'
  3.         . ' 2011-05-15T07:26:45.877-03:00 2011-05-15T19:26:45.877-03:00'
  4.         . ' ++CiAgICAgICAgICAgICAgICA8cmVsYXRpb24gcmVsdHlwZT0iNCIga2V5PS'
  5.         . 'IzMDUwMTk4NjE2NiIvPgogICAgICAgICAgICA8L3JlbGF0aW9ucz4KICAgICA'
  6.         . 'qPzqDCigK52QDCoc0CTHLIDY8exkQeyMjc+qE+m6pvncrjcAv2j'
  7.         . 'jnoPkSaWvls1jxFj5kyrE2Zmz5CVyB8ueihvFEJMH2EabGtRC/0ZxOkNr2TuQ'
  8.         . 'F11H2wX9x5yCQeUck9LE5b3BZHJTrT8KK6ihLI= ';
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Tengo que particionarla, obteniendo los siguientes valores:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $source = ' CN=wsaahomo, O=AIP, C=AR, SERIALNUMBER=CUIT 37878239';
  2. my $destination = 'C=ar, O=glut, SERIALNUMBER=CUIT 3059446, CN=wsfe_glu';
  3. my $uniqueid = 2580755959;
  4. my $fecha_1 = '2011-05-15T07:26:45.877-03:00';
  5. my $fecha_2 = '2011-05-15T19:26:45.877-03:00';
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


# Token_1 y $token_2 sucesión de cualquier tipo de carácter de longitud variable, SEPARADOS token_1 de Token_2 por un BLANCO

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $token_1= '++CiAgICAgICAgICAgICAgICA8cmVsYXRpb24gcmVsdHlwZT0iNCIga2V5PS'
  2.         . 'IzMDUwMTk4NjE2NiIvPgogICAgICAgICAgICA8L3JlbGF0aW9ucz4KICAgICA'
  3.         . 'qPzqDCigK52QDCoc0CTHLIDY8exkQeyMjc+qE+m6pvncrjcAv2j';
  4.  
  5. my $token_2 = 'jnoPkSaWvls1jxFj5kyrE2Zmz5CVyB8ueihvFEJMH2EabGtRC/0ZxOkNr2TuQ'
  6.         . 'F11H2wX9x5yCQeUck9LE5b3BZHJTrT8KK6ihLI= ' ;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¡¡¡¡Gracias!!!!
Última edición por explorer el 2011-05-22 17:11 @758, editado 1 vez en total
Razón: Marcas Perl
Lor
Perlero nuevo
Perlero nuevo
 
Mensajes: 187
Registrado: 2005-04-28 05:47 @282

Re: XML::Compile::WSDL

Notapor explorer » 2011-05-22 17:36 @775

Deberías aprender un poquito de expresiones regulares... ahorra mucha programación... ;)

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use Modern::Perl;
  3.  
  4. my $respuesta
  5.     = ' CN=wsaahomo, O=AIP, C=AR, SERIALNUMBER=CUIT 37878239 C=ar,'
  6.     . ' O=glut, SERIALNUMBER=CUIT 3059446, CN=wsfe_glu 2580755959'
  7.     . ' 2011-05-15T07:26:45.877-03:00 2011-05-15T19:26:45.877-03:00'
  8.     . ' ++CiAgICAgICAgICAgICAgICA8cmVsYXRpb24gcmVsdHlwZT0iNCIga2V5PS'
  9.     . 'IzMDUwMTk4NjE2NiIvPgogICAgICAgICAgICA8L3JlbGF0aW9ucz4KICAgICA'
  10.     . 'qPzqDCigK52QDCoc0CTHLIDY8exkQeyMjc+qE+m6pvncrjcAv2j '
  11.     . 'jnoPkSaWvls1jxFj5kyrE2Zmz5CVyB8ueihvFEJMH2EabGtRC/0ZxOkNr2TuQ'
  12.     . 'F11H2wX9x5yCQeUck9LE5b3BZHJTrT8KK6ihLI= '
  13.     ;
  14.  
  15. my $fecha_rx = qr/[T:\d.-]+/;
  16.  
  17. my( $source, $destination, $uniqueid,
  18.     $fecha_1, $fecha_2,
  19.     $token_1, $token_2
  20. )
  21.     = $respuesta =~
  22.         m/
  23.             (CN=.+? SERIALNUMBER=.+?)   # $source
  24.             [ ]
  25.             (C=.+? CN=\S+)              # $destination
  26.             [ ]
  27.             (\d+)                       # uniqueid
  28.             [ ]
  29.             ($fecha_rx)                 # fecha_1
  30.             [ ]
  31.             ($fecha_rx)                 # fecha_2
  32.             [ ]
  33.             (\S+)                       # token_1
  34.             [ ]
  35.             (\S+)                       # token_2
  36.         /x;
  37.  
  38. say "[$source]";
  39. say "[$destination]";
  40. say "[$uniqueid]";
  41. say "[$fecha_1]";
  42. say "[$fecha_2]";
  43. say "[$token_1]";
  44. say "[$token_2]";
  45.  
  46. __END__
  47.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Una cosa más: te pido por favor que uses el sistema de marcado Perl cuando mandes código en Perl.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

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

cron