2011-09-16 08:11 @382 |
|
|
coltx
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 Using perl Syntax Highlighting $VAR1 = {
'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
'soap:Body' => {
'enlaceprueba' => {
'xmlns' => 'http://www.prueba.com/',
'enlacepruebaresult' => {
'NewDataSet' => {
'xmlns' => '',
'table' => [
{
'id' => '1',
'campo2' => '2',
'campo3' => '2',
},
{
'id' => '2',
'campo2' => '3',
'campo3' => '3',
}
]
}
}
}
},
'xmlns:xsd' => 'http://www.w3.org/2001/XMLSchema',
'xmlns:soap' => 'http://schemas.xmlsoap.org/soap/envelope/'
};
|
2011-09-16 09:51 @452 |
|
|
 |
explorer
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: Using perl Syntax Highlighting #!/usr/bin/perl
use 5.010;
my $VAR1 = {
'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
'soap:Body' => {
'enlaceprueba' => {
'xmlns' => 'http://www.prueba.com/',
'enlacepruebaresult' => {
'NewDataSet' => {
'xmlns' => '',
'table' => [
{
'id' => '1',
'campo2' => '2',
'campo3' => '2',
},
{
'id' => '2',
'campo2' => '3',
'campo3' => '3',
}
]
}
}
}
},
'xmlns:xsd' => 'http://www.w3.org/2001/XMLSchema',
'xmlns:soap' => 'http://schemas.xmlsoap.org/soap/envelope/'
};
say $VAR1->{'soap:Body'}->{'enlaceprueba'}->{'enlacepruebaresult'}->{'NewDataSet'}->{'table'}->[1]->{'id'};
__END__
2
_________________ JF^D Perl programming
|
2011-09-20 08:00 @375 |
|
|
coltx
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;
|
2011-09-20 15:22 @682 |
|
|
coltx
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.
|
2011-09-21 15:02 @668 |
|
|
 |
explorer
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
|
2011-09-23 16:27 @727 |
|
|
coltx
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...
|
2011-09-23 17:00 @750 |
|
|
 |
explorer
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
|
2011-09-23 19:56 @872 |
|
|
coltx
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... Using xml Syntax Highlighting <?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 Using xml Syntax Highlighting <?xml version="1.0" encoding="utf-8"?>
<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/">
<soap:Header>
<Credentials xmlns="http://www.prueba.com/">
<user>usuario</user>
<pass>password</pass>
<area>id_area</area>
</Credentials>
</soap:Header>
<soap:Body>
<enlace_prueba xmlns="http://www.prueba.com/">
<con_xml>
<search>
<segmento>vip</segmento>
<id>22</id>
<movimiento>m</movimiento>
<busqueda></busqueda>
<id_med>10</id_med>
<id_neg></id_neg>
<inicio>01-01-2011</inicio>
<fin>31-01-2011</fin>
</search>
</con_xml>
</enlace_prueba>
</soap:Body>
</soap:Envelope>
|
2011-09-24 14:34 @649 |
|
|
 |
explorer
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: Using perl Syntax Highlighting my $respuesta_decodificada = $response->decoded_content;
my($id_plan) = $respuesta_decodificada =~ m{<id_plan>(.*?)</id_plan>};
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): Using perl Syntax Highlighting use SOAP::Lite;
my $service = SOAP::Lite
-> uri('/examples')
-> proxy(
'http://services.soaplite.com/auth/examples.cgi',
credentials => [
'www.prueba.com:80', # host:port
'id_area', # realm
'usuario' => 'password', # user, password
]
)
;
print $service->search(
SOAP::Data->name(segmento => 'vip' ),
SOAP::Data->name(id => 22 ),
SOAP::Data->name(movimiento => 'm' ),
SOAP::Data->name(id_med => 10 ),
SOAP::Data->name(id_neg => '' ),
SOAP::Data->name(inicio => '01-01-2011'),
SOAP::Data->name(fin => '31-01-2011'),
)
->result;
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
|
2011-09-25 19:21 @848 |
|
|
coltx
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í.. Using xml Syntax Highlighting <?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...
|
2011-09-26 06:50 @326 |
|
|
 |
explorer
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
|
2011-09-30 07:27 @352 |
|
|
 |
explorer
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
|
2011-12-21 19:38 @860 |
|
|
coltx
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: 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.
|
2011-12-21 21:21 @931 |
|
|
 |
explorer
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: Using perl Syntax Highlighting #!/usr/bin/perl
my $respuesta_decodificada = '<id_plan>1</id_plan>
<id_plan>3</id_plan>
<id_plan></id_plan>
<id_plan>5</id_plan>
<id_plan>6</id_plan>';
my @id_plan = $respuesta_decodificada =~ m{<id_plan>(.*?)</id_plan>}gsm;
print join('|', @id_plan), "\n";
__END__
1|3||5|6
Observa: hay un undef en la tercera posición.
_________________ JF^D Perl programming
|
| 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
|
|
Socializa |
 |
|