• Publicidad

Cómo leer un SOAP

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

Cómo leer un SOAP

Notapor coltx » 2011-09-16 08:11 @382

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


Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $VAR1 = {
  2.           'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
  3.           '<span class="posthilit">soap</span>: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:<span class="posthilit">soap</span>' => 'http://schemas.xmlsoap.org/<span class="posthilit">soap</span>/envelope/'
  27.         };
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
coltx
Perlero nuevo
Perlero nuevo
 
Mensajes: 79
Registrado: 2011-09-16 08:01 @376

Publicidad

Re: Cómo leer un SOAP

Notapor explorer » 2011-09-16 09:51 @452

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:
Sintáxis: [ Descargar ] [ Ocultar ]
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.           '<span class="posthilit">soap</span>: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:<span class="posthilit">soap</span>' => 'http://schemas.xmlsoap.org/<span class="posthilit">soap</span>/envelope/'
  30.         };
  31.  
  32. say $VAR1->{'<span class="posthilit">soap</span>:Body'}->{'enlaceprueba'}->{'enlacepruebaresult'}->{'NewDataSet'}->{'table'}->[1]->{'id'};
  33.  
  34. __END__
  35. 2
  36.  
Coloreado en 0.002 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: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Cómo leer un SOAP

Notapor coltx » 2011-09-20 08:00 @375

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;
coltx
Perlero nuevo
Perlero nuevo
 
Mensajes: 79
Registrado: 2011-09-16 08:01 @376

Re: Cómo leer un SOAP

Notapor explorer » 2011-09-20 08:59 @416

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 & 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: Cómo leer un SOAP

Notapor coltx » 2011-09-20 15:22 @682

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.
coltx
Perlero nuevo
Perlero nuevo
 
Mensajes: 79
Registrado: 2011-09-16 08:01 @376

Re: Cómo leer un SOAP

Notapor explorer » 2011-09-21 15:02 @668

¿$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 & 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: Cómo leer un SOAP

Notapor coltx » 2011-09-23 16:27 @727

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...
coltx
Perlero nuevo
Perlero nuevo
 
Mensajes: 79
Registrado: 2011-09-16 08:01 @376

Re: Cómo leer un SOAP

Notapor explorer » 2011-09-23 17:00 @750

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 & 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: Cómo leer un SOAP

Notapor coltx » 2011-09-23 19:56 @872

Estimado explorer: al aplicar print $response->decoded_content; me sale lo siguiente...

Sintáxis: [ Descargar ] [ Ocultar ]
Using xml Syntax Highlighting
  1. <?xml version="1.0" encoding="utf-8"?><<span class="posthilit">soap</span>:Envelope xmlns:<span class="posthilit">soap</span>="http://schemas.xmlsoap.org/<span class="posthilit">soap</span>/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><<span class="posthilit">soap</span>:Body><enlaceprueba xmlns="http://www.prueba.com/"><enlacepruebaresult><NewDataSet xmlns=""><tabla><id_plan>4</id_plan>
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

... 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
Sintáxis: [ Descargar ] [ Ocultar ]
Using xml Syntax Highlighting
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <<span class="posthilit">soap</span>:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:<span class="posthilit">soap</span>="http://schemas.xmlsoap.org/<span class="posthilit">soap</span>/envelope/">
  3.   <<span class="posthilit">soap</span>:Header>
  4.    <Credentials xmlns="http://www.prueba.com/">
  5.       <user>usuario</user>
  6.       <pass>password</pass>
  7.       <area>id_area</area>
  8.   </Credentials>
  9.   </<span class="posthilit">soap</span>:Header>
  10.   <<span class="posthilit">soap</span>: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.   </<span class="posthilit">soap</span>:Body>
  26. </<span class="posthilit">soap</span>:Envelope>
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
coltx
Perlero nuevo
Perlero nuevo
 
Mensajes: 79
Registrado: 2011-09-16 08:01 @376

Re: Cómo leer un SOAP

Notapor explorer » 2011-09-24 14:34 @649

Para extraer el valor puedes usar una expresión regular normal:
Sintáxis: [ Descargar ] [ Ocultar ]
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";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


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):

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use <span class="posthilit">SOAP</span>::Lite;
  2.  
  3. my $service = <span class="posthilit">SOAP</span>::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.                         <span class="posthilit">SOAP</span>::Data->name(segmento   => 'vip'       ),
  17.                         <span class="posthilit">SOAP</span>::Data->name(id         => 22          ),
  18.                         <span class="posthilit">SOAP</span>::Data->name(movimiento => 'm'         ),
  19.                         <span class="posthilit">SOAP</span>::Data->name(id_med     => 10          ),
  20.                         <span class="posthilit">SOAP</span>::Data->name(id_neg     => ''          ),
  21.                         <span class="posthilit">SOAP</span>::Data->name(inicio     => '01-01-2011'),
  22.                         <span class="posthilit">SOAP</span>::Data->name(fin        => '31-01-2011'),
  23.                 )
  24.               ->result;
  25.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

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 & 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

Siguiente

Volver a Básico

¿Quién está conectado?

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

cron