• Publicidad

Convertir Mensaje SOAP....

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Notapor explorer » 2006-07-14 17:20 @763

Un ejemplo que me he hecho esta tarde...
De la parte de servidor:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
#
# Salida de información del muelle
# a través de SOAP
#
# Joaquin Ferrero, Julio 2006

package Muelle;

sub consultaUnManifiestoResponse {
    my $self = shift;
    my %datos = (
        nTrans      => 465,
        cTransp     => 'HYBU',
        idTransp    => 7116834,
        nomBuque    => 'ARGOSY',
        numViaje    => '416 SB MEX',
        fecEstimada => '15/12/2004 12:00:00 AM',
        tipoOper    => 1,
        lineaNaviera=> 'NAVIERA VICANE',
        fecRecibe   => '14/12/2004 4:09:46 PM',
        cuAduana    => 53,
        cuPais      => 'ATG',
        cuPuerto    => 'PMS',
        cuEntidadMan=> 1158,
        casos       => '',
        );

    # Como ejemplo, le añadimos los parámetros pasados por el usuario
    my %parametros = %{shift()};
    @datos{keys %parametros} = @parametros{keys %parametros};

    return \%datos;
}

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

SOAP::Transport::HTTP::CGI
    # El muelle se encarga de todo...
    -> dispatch_to('Muelle')
    -> handle;
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
Este servidor lo coloco como CGI, por ser lo más rápido para probar.

Y como cliente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl -l
use SOAP::Lite;

my $soap = SOAP::Lite->new(
    uri     => 'http://localhost/Muelle',
    proxy   => 'http://www.joaquinferrero.com/~atari/cgi-bin/muelle.pl',
);

my $response = $soap->consultaUnManifiestoResponse ({
    barco   => 'ARGOSY',
    manif   => '465',
    usuario => 'API940504EPA',
});

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

foreach my $campo ( keys %resultado ) {
    print "\t$campo\t$resultado{$campo}";
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


El resultado es:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
        fecEstimada     15/12/2004 12:00:00 AM
        manif   465
        cuAduana        53
        cuPais  ATG
        cuPuerto        PMS
        casos
        idTransp        7116834
        nomBuque        ARGOSY
        numViaje        416 SB MEX
        cTransp HYBU
        lineaNaviera    NAVIERA VICANE
        nTrans  465
        usuario API940504EPA
        barco   ARGOSY
        cuEntidadMan    1158
        tipoOper        1
        fecRecibe       14/12/2004 4:09:46 PM
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Fíjate que en el cliente he colocado como uri el nombre base del módulo que pido, y como proxy, el cgi que se va a ejecutar en la petición.

Con un WSDL, como lo tienes tu, el procedimiento sería casi el mismo, cambiando 'uri' por 'service' (creo, no lo he probado).
Última edición por explorer el 2009-02-23 14:12 @633, editado 1 vez en total
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

Publicidad

Hola Explorer

Notapor caribesoft » 2006-07-18 04:57 @248

Hola, Explorer:

No sabes cuánto te agradezco tu tiempo y el buen ejemplo que me hiciste, funciona de maravilla.

Pero, fíjate que llevo dos noches sin dormir y no puedo lograr hacer bien el hash, leí el SOAP::Lite completo, vi ejemplos, probé el tuyo, pero sigo atorado, ¿¿ tu crees ??

Este es el código de script con el cual puedo enviar el mensaje y recibir respuesta, pero no entiendo cómo formar el hash:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!c:\perl\bin/Perl.exe
  2. use strict;
  3. use LWP::UserAgent;
  4. use HTTP::Request::Common;
  5. print "Content-type: text/html; charset=iso-8859-1\n\n";
  6.  
  7. my $valor;my $campo;
  8. my $barco   = 'ARGOSY';
  9. my $manif   = '465';
  10. my $usuario = 'API940504EPA';
  11. my $message = "<?xml version=\"1.0\" encoding=\"utf-8\"?>
  12.       <soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"
  13.          xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"
  14.          xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">
  15.          <soap:Header>
  16.            <EncabezadoSOAP xmlns=\"http://Recintos/ServiciosWebXml/\">
  17.                <idUsuario>$usuario</idUsuario>
  18.                <firma>1239</firma>
  19.                <ipCliente></ipCliente>
  20.            </EncabezadoSOAP>
  21.          </soap:Header>
  22.       <soap:Body>
  23.            <consultaUnManifiesto xmlns=\"http://Recintos/ServiciosWebXml/\">
  24.               <manifiesto>$manif</manifiesto>
  25.               <buque>$barco</buque>
  26.           </consultaUnManifiesto>
  27.      </soap:Body>
  28.    </soap:Envelope>";
  29.  
  30. my $userAgent = LWP::UserAgent->new();
  31. my $request = HTTP::Request->new(POST => 'http://192.168.220.108/wsrefis/RecintosFis.asmx?WSDL');
  32. $request->header(SOAPAction => '"http://Recintos/ServiciosWebXml/consultaUnManifiesto"');
  33. $request->content($message);
  34. $request->content_type("text/xml; charset=utf-8");
  35.  
  36. my $response = $userAgent->request($request);
  37.  
  38. my %resultado = %{$response};
  39.  
  40. while (( $campo, $valor) = each(%resultado )){
  41.        print "<p>CAMPO : $campo - $valor";
  42.  
  43. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Esto es lo que obtengo :
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
CAMPO : _content - 01465HYBU7116834 ARGOSY416 SB MEX15/12/2004 12:00:00 AM1NAVIERA VICANE14/12/2004 4:09:46 PM53ATGPMS1158465HYBU7116834 ARGOSY416 SB MEX15/12/2004 12:00:00 AM1NAVIERA VICANE14/12/2004 4:09:46 PM53ATGPMS1158

CAMPO : _protocol - HTTP/1.1

CAMPO : _headers - HTTP::Headers=HASH(0x18e92c0)

CAMPO : _rc - 200

CAMPO : _msg - OK

CAMPO : _request - HTTP::Request=HASH(0x16e2354)
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


No entiendo cómo separar los campos y su valor de cada registro, ¿¿¿ me podrías dar una última ayudita ???

Saludos,

Caribesoft
caribesoft
Perlero nuevo
Perlero nuevo
 
Mensajes: 73
Registrado: 2006-05-09 22:01 @959
Ubicación: Cancun

Notapor explorer » 2006-07-18 05:19 @263

Después de hacer el $userAgent->request, lo que obtienes es un objeto HTTP::Response y lo estás almacenando en $response.

Para acceder al contenido de la respuesta, debes usar lo mismo que usabas en el primer ejemplo que has puesto: as_string.

Quedaría algo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $xml_resultado = $response->as_string;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Luego, habría que meter ese xml en el SOAP::Custom::XML::Deserializer:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $d = SOAP::Custom::XML::Deserializer
  -> deserialize( $xml_resultado )
  -> valueof('/Envelope/Body');
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Y ya se puede acceder al contenido del mensaje, de forma programática:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $man = $d->consultaUnManifiestoResponse->consultaUnManifiestoResult->man;
my @campos = qw(
    nTrans          cTransp         idTransp        nomBuque
    numViaje        fecEstimada     tipoOper        lineaNaviera
    fecRecibe       cuAduana        cuPais          cuPuerto
    cuEntidadMan    casos
 );

foreach my $campo ( @campos ) {
    print "$campo: ", $man->$campo,"\n";
}

# Acceso directo a un elemento concreto
print "manifiestos/cTransp: ",
    $d  ->consultaUnManifiestoResponse
            ->consultaUnManifiestoResult
                ->manifiestos
                    ->anyType
                        ->cTransp,
   "\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

aunque sigo pensando que sería más cómodo usar el método del WSDL. ¿No te han dado ninguno?
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

Recibo un mesaje de error

Notapor caribesoft » 2006-07-18 09:36 @442

Hola explorer :

Ya hice el script como me indicaste en tu ejemplo, al parecer sí funciona, pero estoy recibiendo un error:


Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
\r
[Tue Jul 18 09:30:09 2006] [error] [client 127.0.0.1] ' before XML element\r
[Tue Jul 18 09:34:59 2006] [error] [client 127.0.0.1] \r
[Tue Jul 18 09:34:59 2006] [error] [client 127.0.0.1] not well-formed (invalid token) at line 1, column 4, byte 4 at C:/Perl/site/lib/XML/Parser.pm line 187\r
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


¿Crees que pueda ser un error de configuración del servidor?, como podrás ver se corta cuando va empezar a imprimir el XML.

Saudos y muchas gracias,

Caribesoft
caribesoft
Perlero nuevo
Perlero nuevo
 
Mensajes: 73
Registrado: 2006-05-09 22:01 @959
Ubicación: Cancun

Notapor explorer » 2006-07-18 09:48 @450

Saca el xml directamente a un fichero y analízalo. El error dice que XML::Simple ha encontrado un error en la cabecera del xml devuelto.
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

Notapor explorer » 2006-07-18 12:05 @545

Bueno, ya encontré la forma para hacer la petición sin tener que crear el xml de petición y sin tantas historias...
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl -l
use SOAP::Lite +trace => [qw(debug)];
$SOAP::Constants::DO_NOT_USE_CHARSET = 1;  # En caso de .NET

my $soap = SOAP::Lite->new(
    uri         => 'http://Recintos/ServiciosWebXml/',
    proxy       => 'http://192.168.240.148/wsrefis/RecintosFis.asmx?WSDL',
    outputxml   => 1,
    readable    => 1,
    namespace   => 'soap',
    encodingspace => '',
    xmlschema     => 'http://www.w3.org/2001/XMLSchema',
    encodingStyle => '',
    use_prefix  => 0,
    on_action   => sub{join '', @_},   # En caso de .NET
);

my @parametros = (
    SOAP::Header->name(
        'EncabezadoSOAP'=> \SOAP::Data->value (
            SOAP::Data->name (idUsuario => 'API940504EPA'),
            SOAP::Data->name (firma     => 1239),
            SOAP::Data->name (ipCliente => ''),
        ),
    )->attr({xmlns=>'http://Recintos/ServiciosWebXml/'}),
    SOAP::Data->name (manifiesto => 465),
    SOAP::Data->name (buque      => 'ARGOSY'),
);

print $soap->call(
    SOAP::Data->name('consultaUnManifiesto')
    ->attr({xmlns => 'http://Recintos/ServiciosWebXml/'}
) => @parametros);

__END__
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Este código genera el mismo xml que pusiste en tu primer mensaje:
Sintáxis: [ Descargar ] [ Ocultar ]
Using xml Syntax Highlighting
<?xml version="1.0" encoding="UTF-8"?>
    <soap:Envelope xmlns="http://schemas.xmlsoap.org/soap/encoding/"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       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:Header>
    <EncabezadoSOAP xmlns="http://Recintos/ServiciosWebXml/">
      <idUsuario xsi:type="xsd:string">API940504EPA</idUsuario>
      <firma xsi:type="xsd:int">1239</firma>
      <ipCliente xsi:type="xsd:string"/>
    </EncabezadoSOAP>
  </soap:Header>
  <soap:Body>
    <consultaUnManifiesto xmlns="http://Recintos/ServiciosWebXml/">
      <manifiesto xsi:type="xsd:int">465</manifiesto>
      <buque xsi:type="xsd:string">ARGOSY</buque>
    </consultaUnManifiesto>
  </soap:Body>
</soap:Envelope>
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

La ventaja de hacerlo así es muy clara: si quisiéramos pedir luego el manifiesto 466 del mismo buque, sólo tendríamos que hacer
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $parametros[1] = SOAP::Data->name (manifiesto => 466);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

y volver a hacer el call...

Notas:
* Está puesto el debug, para que nos muestre en pantalla qué está haciendo. Cuando veamos que funciona bien, hay que dejarlo a use SOAP::Lite;
* Las opciones outputxml y readable son sólo para humanos. Se pueden quitar si sólo van a dialogar las máquinas.
* En la página de SOAP::Lite comenta algunos problemas si se está dialogando con una máquina .Net (como siempre, claro), por lo que hay que tomar algunas precauciones, como está indicado en el código. Creo que falta alguna más, así que habría que consultar la página de SOAP::Lite en esos casos. Es más... sospecho que si no fuera un servidor .Net, el programa quedaría más corto...
Última edición por explorer el 2008-08-13 17:43 @780, editado 1 vez en total
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

¡¡¡ Perfectamente !!!

Notapor caribesoft » 2006-07-18 17:47 @782

Explorer :

Quiero agradecerte infinitamente tu ayuda. Por fin lo logré: puedo manipular la información recibida a través del mensaje SOAP y darle forma y, sobre todo, entendí más el manejo de esta tecnología...

Solo que ahora, adentrándome más con esto, para una consulta del detalle del Manifiesto, que se llama Conocimiento de Embarque, se utiliza una estructura de datos que tiene "Arreglos", y allí me volví a perder un poco; esta es la explicación que me dieron:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
El arreglo conocimientos tiene la siguiente estructura:

            <nTrans>string</nTrans>
            <nConocim>string</nConocim>
            <cuPuertoCD>string</cuPuertoCD>
            <cuEstadoBL>string</cuEstadoBL>
            <personas xmlns="http://Manifiestos/ServiciosWebXml/">
              <anyType />
              <anyType />
            </personas>
            <casos xsi:nil="true" />
            <casos xmlns="http://Manifiestos/ServiciosWebXml/">
              <anyType />
              <anyType />
            </casos>
            <puertos xmlns="http://Manifiestos/ServiciosWebXml/">
              <anyType />
              <anyType />
            </puertos>


Donde:
nTrans. Es el número del manifiesto al que pertenece el conocimiento.
nConocim. Es el número de conocimiento que le asignó el agente naviero.
cuPuertoCD. Es la clave del puerto de carga/descarga.
cuEstadoBL. Es la clave del estado del conocimiento.
personas. Contiene a las personas asociadas al conocimiento.
casos. Son los casos relacionados al conocimiento.
puertos. Contiene a los puertos relacionados con el conocimiento.

Los arreglos personas, casos y puertos tienen la siguiente estructura:
El arreglo personas contiene a objetos del tipo persona:

      <persona>
        <nombre>string</nombre>
        <idFiscal>string</idFiscal>
        <domicilio>string</domicilio>
        <cuTipoPersona>string</cuTipoPersona>
      </persona>

Donde:
nombre. Tiene el nombre de la persona.
idFiscal. Es la identificación fiscal de la persona.
domicilio. Es el domicilio de la persona.
cuTipoPersona. Es la clave del tipo de persona.


El arreglo casos contiene a objetos del tipo caso:

      <caso>
        <idCasoNav>string</idCasoNav>
        <cuCasoNav>string</cuCasoNav>
      </caso>

Donde:
idCasoNav. Es el identificador del caso.
cuCasoNav. Es la clave del caso.


El arreglo puertos contiene a objetos del tipo puerto:

      <puerto>
        <cuPuerto>string</cuPuerto>
        <cuTipoPuerto>string</cuTipoPuerto>
      </puerto>

Donde:
cuPuerto. Es la clave del puerto.
cuTipoPuerto. Es la clave del tipo de puerto.



Una respuesta sin errores sería como esta:


- <resConocimiento xmlns:xsd="http://www.w3.org/2001/XMLSchema"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns="http://Recintos/ServiciosWebXml/">
  <error xmlns="http://Manifiestos/ServiciosWebXml/">0</error>
  <registros xmlns="http://Manifiestos/ServiciosWebXml/">5</registros>
- <conocimientos xmlns="http://Manifiestos/ServiciosWebXml/">
- <anyType xsi:type="conocimiento">
  <nTrans>2</nTrans>
  <nConocim>TSCT48SHOUTUX01</nConocim>
  <cuPuertoCD>HOU</cuPuertoCD>
- <personas>
- <anyType xsi:type="persona">
  <nTrans>2</nTrans>
  <nombre>PETRO STEEL</nombre>
  <idFiscal>0</idFiscal>
  <domicilio>22 SOUTH FRONT ST PHILADELPHIA, PA 19106</domicilio>
  <cuTipoPersona>1</cuTipoPersona>
  </anyType>
+ <anyType xsi:type="persona">
+ <anyType xsi:type="persona">
  </personas>
  <casos />
- <puertos>
- <anyType xsi:type="puerto">
  <cuPuerto>HOU</cuPuerto>
  <cuTipoPuerto>1</cuTipoPuerto>
  </anyType>
+ <anyType xsi:type="puerto">
  </puertos>
  </anyType>
+ <anyType xsi:type="conocimiento">
+ <anyType xsi:type="conocimiento">
+ <anyType xsi:type="conocimiento">
+ <anyType xsi:type="conocimiento">
  </conocimientos>
  </resConocimiento>
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


y allí me perdí un poco para el manejo de los arreglos dentro de ejemplo de script que me enviaste anteriormente.

¿ Podría abusar de tu amabilidad nuevamente ?

Saludos cordiales,

Caribesoft
caribesoft
Perlero nuevo
Perlero nuevo
 
Mensajes: 73
Registrado: 2006-05-09 22:01 @959
Ubicación: Cancun

Notapor explorer » 2006-07-19 05:23 @266

Me conecté a la página oficial y me bajé el documento donde se explica todo el protocolo. Todos los ejemplos están para C# :)

Te contaré un truco. Aparte de activar el sistema de debug para saber qué es lo que se recibe y emite en cada momento, suelo usar el módulo Data::Dumper, que me permite ver 'por dentro' las variables. De esa forma puedo saber si son un XML, si son un array o hashes o estructuras más complicadas o si son de un determinado tipo de objetos. De esa forma, luego consultando el manual, puedo saber qué funciones puedo utilizar con ellas.

Si la respuesta a una petición es un tipo complejo, tendrás que estudiar la documentación donde se hable de este tipo de datos.

En viewtopic.php?t=1046 hay algo más.

Yo de SOAP no sé mucho más... de hecho, acabo de darme cuenta que es muy distinto poner la opción outputxml que no ponerla, ya que la respuesta puede ser un simple xml o un objeto SOAP::SOM, por lo que el código cambia mucho de una situación a la otra.

No puedo ayudarte más, ya que yo no tengo acceso a un servidor SOAP como tienes tu. El mío no me da las mismas respuestas que a ti. Las pruebas habría que hacerlas directamente sobre ese servidor.

Ya te digo: usa Data::Dumper sin miedo.
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

Muchas Gracias

Notapor caribesoft » 2006-07-20 09:22 @432

Muchas gracias, Explorer :

En verdad con el script que diseñaste, pude entender más acerca del funcionamiento del SOAP, y ya empecé a ver el DATA::Dumper, en realidad puedes ver todo por dentro..., voy a estar estudiando esta sección y tratar de ver cómo extraigo la información de la respuesta del mensaje SOAP que viene en arreglos.

Nuevamente te agradezco tu tiempo y el compartir tu amplio conocimiento de este fabuloso lenguaje con un servidor, más adelante te comento de los resultados obtenidos y ojalá le sirva a otros colegas,
Saludos,

Caribesoft.
caribesoft
Perlero nuevo
Perlero nuevo
 
Mensajes: 73
Registrado: 2006-05-09 22:01 @959
Ubicación: Cancun

Nuevamente preguntando

Notapor caribesoft » 2006-07-22 12:39 @569

Qué tal, Explorer :

Fíjate que estuve leyendo y observando los ejemplos que me recomendaste y por fin pude lograr hacer lo que deseaba, bueno la primera parte, que era ver la información recibida en el SOAP Response formateada para una estructura de datos de Perl, le agregué el siguiente código después del DESERIALIZE y funciona de maravilla :

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
foreach my $campo ($d->consultaConocimDeManifResponse->consultaConocimDeManifResult->conocimientos->anyType){
    print  $campo->nTrans,
           $campo->nTrans,
           $campo->nConocim,
           $campo->cuPuertoCD,
           $campo->cuEstadoBL,
           $campo->personas,
           $campo->casos,
           $campo->puertos,"\n";
           foreach my $row ($campo->personas->anyType) {
                 print  $row->nombre,
                 $row->idFiscal,
                 $row->domicilio,
                 $row->cuTipoPersona,"\n";
           }

  }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Me despliega la información, y en el caso de "personas" viene en un array, lo despliego bien de esta manera.

... Pero ahora tengo otra pregunta: ¿Cuál sería la mejor forma de pasarlo a una tabla de MySQL, haciendo primero un arreglo o hash o directamente ??, si me puedes dar un pequeños ejemplo, te lo agredeceré eternamente porque con eso terminaría mi proyecto ...

Saludos cordiales,

Caribesoft
caribesoft
Perlero nuevo
Perlero nuevo
 
Mensajes: 73
Registrado: 2006-05-09 22:01 @959
Ubicación: Cancun

AnteriorSiguiente

Volver a Intermedio

¿Quién está conectado?

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