Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 
Índice general » Mundo Perl » Básico » Cómo leer un SOAP Responder al tema
Nuevo tema


Página 1 de 2  [ 18 mensajes ]  Ir a página 1, 2  Siguiente
 
Nota 2011-09-16 08:11 @382

Perlero Nuevo
Registrado: 2011-09-16 08:01 @376
Mensajes: 14
Cómo leer un SOAP
Favor, su ayuda. Al enviar una consulta a un webservice, recibo la siguiente estructura, pero no he podido tomar sus valores. ¿Me sirve XML simple o debo ocupar solo Soap Lite ?... Gracias


Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. $VAR1 = {
  2.           'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
  3.           'soap:Body' => {
  4.                          'enlaceprueba' => {
  5.                                            'xmlns' =>   'http://www.prueba.com/',
  6.                                            'enlacepruebaresult' => {
  7.                                                                    'NewDataSet' => {
  8.                                                                                    'xmlns' => '',
  9.                                                                                    'table' => [
  10.                                                                                                 {
  11.                                                                                                   'id' => '1',
  12.                                                                                                   'campo2' => '2',
  13.                                                                                                   'campo3' => '2',
  14.                                                                                                 },
  15.                                                                                                 {
  16.                                                                                                   'id' => '2',
  17.                                                                                                   'campo2' => '3',
  18.                                                                                                   'campo3' => '3',
  19.                                                                                                 }
  20.                                                                                               ]
  21.                                                                                    }
  22.                                                                    }
  23.                                            }
  24.                          },
  25.           'xmlns:xsd' => 'http://www.w3.org/2001/XMLSchema',
  26.           'xmlns:soap' => 'http://schemas.xmlsoap.org/soap/envelope/'
  27.         };


Nota 2011-09-16 09:51 @452
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10249
Re: Cómo leer un SOAP
Bienvenido a los foros de Perl en español, coltx.

Lo normal es que uses SOAP::Lite para poder acceder de forma cómoda a esas respuestas, pero si el resultado es la estructura de datos que muestras, puedes acceder de forma directa a su contenido.

Ejemplo:
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use 5.010;
  3.  
  4. my $VAR1 = {
  5.           'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
  6.           'soap:Body' => {
  7.                          'enlaceprueba' => {
  8.                                            'xmlns' =>   'http://www.prueba.com/',  
  9.                                            'enlacepruebaresult' => {
  10.                                                                    'NewDataSet' => {
  11.                                                                                    'xmlns' => '',
  12.                                                                                    'table' => [
  13.                                                                                                 {
  14.                                                                                                   'id' => '1',
  15.                                                                                                   'campo2' => '2',
  16.                                                                                                   'campo3' => '2',
  17.                                                                                                 },
  18.                                                                                                 {
  19.                                                                                                   'id' => '2',
  20.                                                                                                   'campo2' => '3',
  21.                                                                                                   'campo3' => '3',
  22.                                                                                                 }
  23.                                                                                               ]
  24.                                                                                    }
  25.                                                                    }
  26.                                            }
  27.                          },
  28.           'xmlns:xsd' => 'http://www.w3.org/2001/XMLSchema',
  29.           'xmlns:soap' => 'http://schemas.xmlsoap.org/soap/envelope/'
  30.         };
  31.  
  32. say $VAR1->{'soap:Body'}->{'enlaceprueba'}->{'enlacepruebaresult'}->{'NewDataSet'}->{'table'}->[1]->{'id'};
  33.  
  34. __END__
  35. 2
  36.  

_________________
JF^D Perl programming


Nota 2011-09-20 08:00 @375

Perlero Nuevo
Registrado: 2011-09-16 08:01 @376
Mensajes: 14
Re: Cómo leer un SOAP
Estimado explorer, muchas gracias por tu respuesta, pero quizás me faltó agregar algo a mi consulta y es que la respuesta desde el ws la dejo almacenada en un string, entonces, ¿cómo puedo recuperar los datos desde ahí? Gracias.

my $xml_resultado = $response->as_string;


Nota 2011-09-20 08:59 @416
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10249
Re: Cómo leer un SOAP
Lo más cómodo es recuperar la información desde $response usando las funciones y métodos que acceden a la estructura de datos subyacente.

Si, en cambio, eso te es complicado de hacer, lo que has hecho es pasarlo todo a una cadena de caracteres. Y la forma de sacar la información desde esa cadena depende del formato y estructura de esa cadena.

En Perl tienes las funciones, split(), index(), rindex(), substr(), chop() y chomp() y las expresiones regulares para extraer la información desde esa cadena.

Más información en perlop.

_________________
JF^D Perl programming


Nota 2011-09-20 15:22 @682

Perlero Nuevo
Registrado: 2011-09-16 08:01 @376
Mensajes: 14
Re: Cómo leer un SOAP
Nuevamente gracias por la explicación, explorer, creo que la mejor opción es tomar los valores desde el $response, ya que se complica mucho a través del string.

¿Me podrías ayudar con la obtención de los valores? Al realizar lo siguiente me retorna :

Useless use of hash element in void context at prueba.pl line 67.
HASH(0x14730f0)


El código desde el response es el siguiente:

my $request = HTTP::Request->new(POST => 'https://www.server.com/prueba.asmx');
$request->header(SOAPAction => '"http://www.server.com/enlaceprueba"');
$request->content($message);
$request->content_type("text/xml; charset=utf-8");
my $response = $userAgent->request($request);

$VAR1->{'soap:Body'}->{'enlaceprueba'}->{'enlacepruebaresult'}->{'NewDataSet'}->{'table'}->[1]->{'id'};

print $VAR1;

Gracias.


Nota 2011-09-21 15:02 @668
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10249
Re: Cómo leer un SOAP
¿$VAR1? ¿No era $response?

Estoy viendo que estás ejecutando el protocolo SOAP "a pelo", lo cual tiene mérito, pero no deja de ser una simple petición HTTP...

¿No sería más cómodo usar SOAP::Lite?

Al hacerlo como muestras, yo sacaría primero la estructura de $response, con Data::Dumper, por ejemplo. Si resulta que es como nos has indicado antes, pues solo queda cambiar el $VAR1 por el $response. Y acceder a los valores cambiando las claves.

_________________
JF^D Perl programming


Nota 2011-09-23 16:27 @727

Perlero Nuevo
Registrado: 2011-09-16 08:01 @376
Mensajes: 14
Re: Cómo leer un SOAP
Estimado explorer, me está dando un dolor de cabeza el tema... Cuando hablas de usar Data::Dumper ¿se debe exportar a un archivo y luego desde ahí, leerlo?, ¿o puede ser realizado en el mismo script con el cual realizo la consulta al ws?, Gracias nuevamente...


Nota 2011-09-23 17:00 @750
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10249
Re: Cómo leer un SOAP
Data::Dumper (o Data::Printer) se usan para ver la estructura de datos de una variable.

Si una variable es solo una cadena de caracteres, pues entonces con un print() o un say() podemos ver qué es lo que contiene.

En cambio, si la variable es una referencia a un array de hash que contiene array con hash como elementos... pues es mejor verlo en pantalla para estar seguros de que es así, y no un array de array de hash de array de hash.

Viendo la documentación de HTTP::Response (que es el tipo de objeto que devuelve $userAgent->request), a ti lo único que te hace falta es ejecutar

print $response->decoded_content;

para obtener (de momento en pantalla) el contenido de la respuesta, que supongo que será un escalar.

A partir de ahí, luego ya podemos pensar cómo sacar lo que quieres sacar.

Esto es por hacer la petición de forma manual, como ya te dije. Si miras el hilo Cliente webservice en Perl, reciente, u otros (usa el sistema de búsqueda. Busca por 'SOAP').

_________________
JF^D Perl programming


Nota 2011-09-23 19:56 @872

Perlero Nuevo
Registrado: 2011-09-16 08:01 @376
Mensajes: 14
Re: Cómo leer un SOAP
Estimado explorer: al aplicar print $response->decoded_content; me sale lo siguiente...

Syntax: [ Download ] [ Hide ]
Using xml Syntax Highlighting
  1. <?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><enlaceprueba xmlns="http://www.prueba.com/"><enlacepruebaresult><NewDataSet xmlns=""><tabla><id_plan>4</id_plan>

... la consulta es saber cómo tomo el valor 4 de lo que está en la marca <id_plan>4</id_plan>.

Pensando en llevar el tema a SOAP::Lite, ¿cómo envío un mensaje de este tipo?

Otra vez, muchas gracias
Syntax: [ Download ] [ Hide ]
Using xml Syntax Highlighting
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  3.   <soap:Header>
  4.    <Credentials xmlns="http://www.prueba.com/">
  5.       <user>usuario</user>
  6.       <pass>password</pass>
  7.       <area>id_area</area>
  8.   </Credentials>
  9.   </soap:Header>
  10.   <soap:Body>
  11.     <enlace_prueba xmlns="http://www.prueba.com/">
  12.       <con_xml>
  13.         <search>
  14.                  <segmento>vip</segmento>
  15.                  <id>22</id>
  16.                  <movimiento>m</movimiento>
  17.                  <busqueda></busqueda>
  18.                  <id_med>10</id_med>
  19.                  <id_neg></id_neg>
  20.                  <inicio>01-01-2011</inicio>
  21.                  <fin>31-01-2011</fin>
  22.         </search>
  23.       </con_xml>
  24.     </enlace_prueba>
  25.   </soap:Body>
  26. </soap:Envelope>


Nota 2011-09-24 14:34 @649
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10249
Re: Cómo leer un SOAP
Para extraer el valor puedes usar una expresión regular normal:
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. my $respuesta_decodificada = $response->decoded_content;
  2.  
  3. my($id_plan) = $respuesta_decodificada =~ m{<id_plan>(.*?)</id_plan>};
  4.  
  5. print "[$id_plan]\n";


En cuanto a cómo hacerlo con SOAP::Lite, habría que mirar la documentación del servidor del que queremos obtener información, pero sería algo así (no probado):

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. use SOAP::Lite;
  2.  
  3. my $service = SOAP::Lite
  4.     -> uri('/examples')
  5.     -> proxy(
  6.            'http://services.soaplite.com/auth/examples.cgi',
  7.            credentials => [
  8.                'www.prueba.com:80',        # host:port
  9.                'id_area',                  # realm
  10.                'usuario' => 'password',    # user, password
  11.            ]
  12.        )
  13.     ;
  14.  
  15. print $service->search(
  16.                         SOAP::Data->name(segmento   => 'vip'       ),
  17.                         SOAP::Data->name(id         => 22          ),
  18.                         SOAP::Data->name(movimiento => 'm'         ),
  19.                         SOAP::Data->name(id_med     => 10          ),
  20.                         SOAP::Data->name(id_neg     => ''          ),
  21.                         SOAP::Data->name(inicio     => '01-01-2011'),
  22.                         SOAP::Data->name(fin        => '31-01-2011'),
  23.                 )
  24.               ->result;
  25.  

Seguramente habrá bastantes errores de notación o habrá formas más breves de crear la petición.

Lo he sacado de SOAP::Lite for Perl.

_________________
JF^D Perl programming


Nota 2011-09-25 19:21 @848

Perlero Nuevo
Registrado: 2011-09-16 08:01 @376
Mensajes: 14
Re: Cómo leer un SOAP
Gracias explorer, he comenzado a sacar los datos de la forma que me has dicho... my($id_plan) = $respuesta_decodificada =~ m{<id_plan>(.*?)</id_plan>}; pero pasa que hay varios id_plan y me muestra solo el primero. ¿Me puedes ayudar en cómo puedo hacer un bucle para extraer el resto de los id_plan...? ¿Si te fijas hay varios valores dentro de los <tabla>....</tabla>

el xml es así..
Syntax: [ Download ] [ Hide ]
Using xml Syntax Highlighting
  1. <?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><enlaceprueba xmlns="http://www.prueba.com/"><enlacepruebaresult><NewDataSet xmlns=""><tabla><id_plan>4</id_plan><comercio>comerciosss1</comercio></tabla><tabla><id_plan>6</id_plan><comercio>comerciosss2</comercio></tabla><tabla><id_plan>7</id_plan><comercio>comerciosss3</comercio></tabla>...


Desde ya muchas gracias...


Nota 2011-09-26 06:50 @326
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10249
Re: Cómo leer un SOAP
coltx escribió:
pero pasa que hay varios id_plan y me muestra solo el primero
Claro... y eso no lo habías dicho, y por eso la solución dada era ajustada a lo que pedías.

Sería algo así:
my @id_plan = $respuesta_decodificada =~ m{<id_plan>(.*?)</id_plan>}gsm;

Y los valores quedan guardados en el array.

_________________
JF^D Perl programming


Nota 2011-09-30 07:27 @352
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10249
Re: Cómo leer un SOAP
En este artículo: Five Tips for .NET Programming in Perl se comentan (en inglés) los problemas que hay cuando se quiere realizar un servicio web contra un servidor web, usando SOAP::Lite.

_________________
JF^D Perl programming


Nota 2011-12-21 19:38 @860

Perlero Nuevo
Registrado: 2011-09-16 08:01 @376
Mensajes: 14
Re: Cómo leer un SOAP
Estimado explorer, gracias por tu ayuda. He logrado consumir desde el WS, pero pasa que algunos datos vienen vacíos y en el array no queda almacenado este "vacío". Al ejecutar esta consulta :

my @id_plan = $respuesta_decodificada =~ m{<id_plan>(.*?)</id_plan>}gsm;

Por ejemplo:
Syntax: [ Download ] [ Hide ]
Using text Syntax Highlighting
<id_plan>1</id_plan>
<id_plan>3</id_plan>
<id_plan></id_plan>
<id_plan>5</id_plan>
<id_plan>6</id_plan>


entonces el arreglo queda así @id_plan[1,3,5,6] , pero el "vacío" no lo almacena... Favor, tu ayuda. Gracias.


Nota 2011-12-21 21:21 @931
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10249
Re: Cómo leer un SOAP
Sí que almacena el vacío. Lo que pasa es que no lo ves.

Mira esto:
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. my $respuesta_decodificada = '<id_plan>1</id_plan>
  3. <id_plan>3</id_plan>
  4. <id_plan></id_plan>
  5. <id_plan>5</id_plan>
  6. <id_plan>6</id_plan>';
  7.  
  8. my @id_plan = $respuesta_decodificada =~ m{<id_plan>(.*?)</id_plan>}gsm;
  9.  
  10. print join('|', @id_plan), "\n";
  11.  
  12. __END__
  13. 1|3||5|6
  14.  

Observa: hay un undef en la tercera posición.

_________________
JF^D Perl programming


Responder al tema  [ 18 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