Página 1 de 2

SOAP::Lite y arrays

NotaPublicado: 2009-02-20 07:37 @359
por julito
¡Hola! Tengo un problema, tengo un webservice java y un cliente en Perl; conecto con el soap y llamo a un método que me devuelve un array, el array lo recibo pero solo recibo la primera posición del array, y no sé qué hacer o cómo tengo qué hacer para recibirlo entero.
¡Muchas gracias! Un buen foro éste, ¡pena no encontrarlo antes!

¡Un saludo!

NotaPublicado: 2009-02-20 09:54 @454
por explorer
Bienvenido a los foros de Perl en Español, julito.

Estaría bien ver algo del código, por si se trata de un error de sintaxis.

Por otra parte, en la sección Array de SOAP::Data se comenta la forma de expresar en forma de SOAP XML las estructuras array de Perl. No sé si será esto lo que estás utilizando.

NotaPublicado: 2009-02-23 04:00 @208
por julito
El código es muy simple... en Java tengo un array que lo devuelvo y en Perl lo recogería así...
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$service = SOAP::Lite
->uri('http://paquete')
  -> proxy('http://localhost:8080/PruebaSaludo/services/Saludar')  
 ->devuelveArray();
 
 my @test_array2 = $service->result();
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


y no hay manera. Solo me coge la primera posición del array y no alcanzo a saber el porqué. ¡Un Saludo!

NotaPublicado: 2009-02-23 04:22 @223
por explorer
El problema parece entonces que está en la composición del array.

Mira aquí.

NotaPublicado: 2009-02-23 04:26 @227
por julito
Pero el array en Java ¿como sería entonces?

Así por ejemplo...

Sintáxis: [ Descargar ] [ Ocultar ]
Using java Syntax Highlighting
String[] array = new String[3];
                array[0]="Barcelona";
                array[1]="Madrid";
                array[2]="Bilbao";
                return array;
Coloreado en 0.012 segundos, usando GeSHi 1.0.8.4


Lo mando así y en Perl recibo el array como si solo tuviera una posición.

NotaPublicado: 2009-02-23 06:11 @299
por explorer
A ver aquí: un problema con la elección de la codificación de los datos complejos. Aunque se refiere a .Net, quizás se puede aplicar a Java.

NotaPublicado: 2009-02-23 11:19 @513
por julito
Buf no me entero, no me entero0o0o0.

NotaPublicado: 2009-02-23 14:11 @632
por explorer
Mira este hilo anterior. Hay un ejemplo publicado por mí en que recupero un hash.

Por lo que viene allí, sería hacer el cambio, en tu código:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my @test_array2 = @{$service->result()};
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Pero... ¡esto es solo una especulación!

NotaPublicado: 2009-02-23 14:40 @653
por explorer
Este es un ejemplo de servidor y cliente, hecho en Perl, que recupera un hash.

Servidor:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
#
# Servidor SOAP de sopa.
#
# Joaquin Ferrero. Febrero 2009.
#

package Sopera;

sub consulta_la_sopera {
    my $self = shift;
    my %ingredientes = (
        pasta => 'fideos',
        liquido => 'agua',
        extra => 'perejil',
    );
    my %extras = %{shift()};

    @ingredientes{keys %extras} = @extras{keys %extras};

    return \%ingredientes;
}

package main;
use SOAP::Transport::HTTP;

SOAP::Transport::HTTP::CGI
    -> dispatch_to('Sopera')
    -> handle()
    ;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Cliente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
#
# Ejemplo de cliente que pide sopa, con SOAP

#use SOAP::Lite;
use SOAP::Lite +trace => [qw(debug)];

my $soap = SOAP::Lite->new(
    uri     => 'http://localhost/Sopera',
    proxy   => 'http://aprosi4.aprosi.net/~atari/cgi-bin/soap-server.pl',
);

my $response = $soap->consulta_la_sopera ({aderezo => 'sal'});

my %resultado = %{$response->result};

for my $item (keys %resultado) {
    print "$item : $resultado{$item}\n";
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

La salida es:
Código: Seleccionar todo
atari@aprosi4:~/public_html/cgi-bin$ ./soap-cliente.pl
SOAP::Transport::HTTP::Client::send_receive: POST http://aprosi4.aprosi.net/~atari/cgi-bin/soap-server.pl HTTP/1.1
Accept: text/xml
Accept: multipart/*
Accept: application/soap
Content-Length: 507
Content-Type: text/xml; charset=utf-8
SOAPAction: "http://localhost/Sopera#consulta_la_sopera"

<?xml version="1.0" encoding="UTF-8"?><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><consulta_la_sopera xmlns="http://localhost/Sopera"><c-gensym3><aderezo xsi:type="xsd:string">sal</aderezo></c-gensym3></consulta_la_sopera></soap:Body></soap:Envelope>
SOAP::Transport::HTTP::Client::send_receive: HTTP/1.1 200 OK
Connection: close
Date: Mon, 23 Feb 2009 19:35:29 GMT
Server: Apache/2.0.55 (Debian) DAV/2 mod_jk2/2.0.4 PHP/4.3.4 mod_perl/2.0.2 Perl/v5.8.8
Vary: Accept-Encoding
Content-Length: 655
Content-Type: text/xml; charset=utf-8
Client-Date: Mon, 23 Feb 2009 19:35:30 GMT
Client-Peer: 172.26.0.3:80
Client-Response-Num: 1
SOAPServer: SOAP::Lite/Perl/0.67

<?xml version="1.0" encoding="UTF-8"?><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><consulta_la_soperaResponse xmlns="http://localhost/Sopera"><s-gensym3><liquido xsi:type="xsd:string">agua</liquido><pasta xsi:type="xsd:string">fideos</pasta><extra xsi:type="xsd:string">perejil</extra><aderezo xsi:type="xsd:string">sal</aderezo></s-gensym3></consulta_la_soperaResponse></soap:Body></soap:Envelope>
liquido : agua
pasta : fideos
extra : perejil
aderezo : sal


Y este es un ejemplo con array. Servidor:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl

package Sopera;

sub consulta_la_sopera {
    my $self  = shift;
    my $largo = shift;

    @ingredientes = 1 .. $largo;

    return \@ingredientes;
}

package main;
use SOAP::Transport::HTTP;

SOAP::Transport::HTTP::CGI
    -> dispatch_to('Sopera')
    -> handle()
    ;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Cliente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
#
use SOAP::Lite;
#use SOAP::Lite +trace => [qw(debug)];

my $soap = SOAP::Lite->new(
    uri     => 'http://localhost/Sopera',
    proxy   => 'http://aprosi4.aprosi.net/~atari/cgi-bin/soap-server.pl',
);

my $response = $soap->consulta_la_sopera(10);

my @resultado = @{$response->result};

print "@resultado\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Y sale:
Código: Seleccionar todo
1 2 3 4 5 6 7 8 9 10

NotaPublicado: 2009-03-26 10:21 @473
por julito
Gracias, chicos; al final lo hice así, para devolver un array entero método paramsout(), mientras que el método result() se limita a devolver el primero.