• Publicidad

JSON con Catalyst, en Perl

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

JSON con Catalyst, en Perl

Notapor neoranger » 2014-11-17 12:33 @564

Buenas, aprovecho que tengo un tiempo libre para hacer varias preguntas respecto a JSON en Perl ya que el proyecto que vamos a comenzar en el trabajo es un proyecto Web.

Tengo un servidor de prueba en Catalyst (Web framework para Perl) creado directamente de un tutorial de ellos donde se explica también el concepto de MVC aplicado al servidor a través de scripts de Perl. El tema es que nosotros para ir aprendiendo un poco más de Perl modificamos ese servidor para que tome un JSON y podamos ver la reacción y cómo se comporta el servidor.

En principio tenemos un problema el cual este servidor genera una vista especificada por nosotros, en este caso HTML donde tiene la siguiente línea de código:
Sintáxis: [ Descargar ] [ Ocultar ]
Using javascript Syntax Highlighting
  1. <script language="javascript" src="[% c.uri_for('/scripts/login/login.js') %]"/>
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


En esta línea de JavaScript lo que queremos hacer es que se invoque ese archivo .js pero no lo hace sino que abajo tenemos que pegarle el código JavaScript en sí para que ande y pueda devolvernos lo que deseamos.

---------------------------------------------------------------------------
EDITO: descarten el problema de arriba, era un tema del código de JS que no estaba aceptando el cierre de la marca. Se completó la línea de JS y esto anda bien. Queda ver los problemas siguientes.
---------------------------------------------------------------------------

Otro problema que tenemos es que al hacer un stash tuvimos que generar una propoedad "foo" para poder encapsular el objeto dentro. Vemos que eso no está bien sino que se tendría que poder meter directamente el objeto.

Les paso algo del código en JavaScript para que se den cuenta de lo que hablo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using javascript Syntax Highlighting
  1.  $("form#loginForm").submit(function() { // loginForm is submitted
  2.     var username = $('#username').attr('value'); // get username
  3.     var password = $('#password').attr('value'); // get password
  4.  
  5.     if (username && password) { // values are not empty
  6.       $.ajax({
  7.         type: "GET",
  8.         url: "account/login", // URL of the Perl script
  9.         contentType: "application/json; charset=utf-8",
  10.         dataType: "json",
  11.         // send username and password as parameters to the Perl script
  12.         data: "username=" + username + "&password=" + password,
  13.         // script call was *not* successful
  14.         error: function(XMLHttpRequest, textStatus, errorThrown) {
  15.           $('div#loginResult').text("responseText: " + XMLHttpRequest.responseText
  16.             + ", textStatus: " + textStatus
  17.             + ", errorThrown: " + errorThrown);
  18.           $('div#loginResult').addClass("error");
  19.         }, // error
  20.         // script call was successful
  21.         // data contains the JSON values returned by the Perl script
  22.         success: function(data){
  23.           if (data.foo.error == '1') { // script returned error
  24.             $('div#loginResult').text("data.error: " + data.foo.message);
  25.             $('div#loginResult').addClass("error");
  26.           } // if
  27.           else { // login was successful
  28.             $('form#loginForm').hide();
  29.             $('div#loginResult').text("data.success: " + data.foo.message
  30.               + ", data.userid: " + data.foo.userid);
  31.             $('div#loginResult').addClass("success");
  32.           } //else
  33.         } // success
  34.       }); // ajax
  35.     } // if
  36.     else {
  37.       $('div#loginResult').text("enter username and password");
  38.       $('div#loginResult').addClass("error");
  39.     } // else
  40.     $('div#loginResult').fadeIn();
  41.     return false;
  42.   });
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Fíjense que tenemos data.foo.message, data.foo.error y data.foo.userid. Lo que queremos hacer es desencapsular el objeto fuera de foo. Si no nos equivocamos esta propiedad es propia de Catalyst y creo que ahí es donde nuestro error radica, pero de otra forma no sabemos hacerlo.

Otro problema que tenemos es que si el login es correcto o no se le pasa 0 o 1 respectivamente para poder chequear por medio de un log que pasa. Pero como eso se serializa para que lo tome JS al deserializarlo ese entero que guardamos queda como string y lo tenemos que convertir a mano.

Creemos que varias cosas nos están pasando porque seguramente nos falta instalar algún módulo de Perl el cual nos haga las cosas más fáciles.

¿Alguna sugerencia? Esto nos pasa al querer hacer un login simple. Repito: es solo para pruebas ya que estamos queriendo aprovechar el tiempo antes de empezar de forma completa con el proyecto.

Gracias.
Última edición por explorer el 2014-11-17 15:52 @703, editado 2 veces en total
Razón: tambien => también; mas => más; como => cómo; linea => línea; si => sí; Fijense => Fíjense; interrogantes;
"Ante muchos ojos todos los errores son obvios." Linus Torvalds
Avatar de Usuario
neoranger
Perlero nuevo
Perlero nuevo
 
Mensajes: 34
Registrado: 2014-11-17 08:10 @382

Publicidad

Re: JSON con Catalyst, en Perl

Notapor neoranger » 2014-11-18 08:38 @401

¿Nadie que me pueda dar una mano con esto? Estamos bloqueados y queremos saber bien cómo se puede solucionar o cómo encarar de otra manera lo que estamos haciendo.

Gracias.
"Ante muchos ojos todos los errores son obvios." Linus Torvalds
Avatar de Usuario
neoranger
Perlero nuevo
Perlero nuevo
 
Mensajes: 34
Registrado: 2014-11-17 08:10 @382

Re: JSON con Catalyst, en Perl

Notapor danimera » 2014-11-18 21:01 @917

Me gustaría ver lo que retorna el account/login como estás haciendo el return... en donde pones el foo :? El código Perl.
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia

Re: JSON con Catalyst, en Perl

Notapor neoranger » 2014-11-19 08:14 @385

El retorno al login es un mensaje solamente para mostrar si está logueado o no.
Te paso el código donde al hacer el post en el login va a la base y se chequea si lo ingresado es correcto.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. # check the username and password in the database
  2. my $statement = qq{SELECT id FROM Users WHERE username=? and password=?};
  3. my $sth = $dbh->prepare($statement)
  4.   or die $dbh->errstr;
  5. $sth->execute($username, $password)
  6.   or die $sth->errstr;
  7. my ($userID) = $sth->fetchrow_array;
  8.  
  9. # create a JSON string according to the database result
  10. my $message = ($userID) ?
  11.   qq{{"success" : "login is successful", "userid" : "$userID"}} :
  12.   qq{{"error" : "username or password is wrong"}};
  13.  
  14. my $error = ($userID) ? 0 : 1;
  15.  
  16. my $result = new Result($error, $message, $userID);
  17.  
  18. $c->log->debug($result->{'error'});
  19. $c->log->debug($result->{'message'});
  20. $c->log->debug($result->{'userid'});
  21.  
  22. $c->stash->{foo} = $result;
  23. $c->forward('View::JSON');
  24. }
  25.  
  26. __PACKAGE__->meta->make_immutable;
  27.  
  28. package Result;
  29.  
  30. sub new {
  31.                 my $class = shift;
  32.                 my $self = bless {
  33.                         'error' => shift,
  34.                         'message' => shift,
  35.                         'userid' => shift
  36.                         }, $class;
  37.                 return $self;
  38. }
  39.  
  40. sub TO_JSON { return { %{ shift() } }; }
  41.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
"Ante muchos ojos todos los errores son obvios." Linus Torvalds
Avatar de Usuario
neoranger
Perlero nuevo
Perlero nuevo
 
Mensajes: 34
Registrado: 2014-11-17 08:10 @382

Re: JSON con Catalyst, en Perl

Notapor neoranger » 2014-11-19 09:24 @434

En el objeto principal tengo creado el siguiente package:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. __PACKAGE__->config(
  2.         'View::JSON' => {
  3.           allow_callback  => 1,    # defaults to 0
  4.           callback_param  => 'cb', # defaults to 'callback'
  5.           expose_stash    => [ qw(foo bar) ], # defaults to everything
  6.       }
  7.     );
  8.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Acá se le está dando las propiedades al JSON y creo que ahí es donde radica el error. Está bien que le hayamos puesto en "expose_stash", "foo" y "bar"?

El ejemplo lo estamos tomando de el siguiente tutorial: https://metacpan.org/pod/Catalyst::Manual::Tutorial::01_Intro , pero fuimos modificando algunas cosas para hacer lo que yo les comentaba antes. Básicamente usamos este tutorial como guia para aprender sin seguir al pie de la letra lo que dice el mismo.
"Ante muchos ojos todos los errores son obvios." Linus Torvalds
Avatar de Usuario
neoranger
Perlero nuevo
Perlero nuevo
 
Mensajes: 34
Registrado: 2014-11-17 08:10 @382

Re: JSON con Catalyst, en Perl

Notapor danimera » 2014-11-19 09:40 @444

No soy experto en Catalyst.

Pero ya trataron de poner directamente $result y no dentro de foo.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $c->stash->{foo} = $result;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


algo como
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $c->stash = $result;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


aunque veo que tienen definido:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. expose_stash    => [ qw(foo bar) ], # defaults to everything
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Aunque creo que podrían retornar $result directamente también.
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia

Re: JSON con Catalyst, en Perl

Notapor neoranger » 2014-11-19 11:03 @502

Si, ya tratamos de retornar solo $resulta y no funciona.
"Ante muchos ojos todos los errores son obvios." Linus Torvalds
Avatar de Usuario
neoranger
Perlero nuevo
Perlero nuevo
 
Mensajes: 34
Registrado: 2014-11-17 08:10 @382

Re: JSON con Catalyst, en Perl

Notapor danimera » 2014-11-19 12:27 @561

Cuando dices que no funciona deberías decir qué mensaje de error o qué sale.
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia

Re: JSON con Catalyst, en Perl

Notapor neoranger » 2014-11-19 12:48 @575

Sale un error de JavaScript indicando error en el JSON configurado.
"Ante muchos ojos todos los errores son obvios." Linus Torvalds
Avatar de Usuario
neoranger
Perlero nuevo
Perlero nuevo
 
Mensajes: 34
Registrado: 2014-11-17 08:10 @382

Re: JSON con Catalyst, en Perl

Notapor danimera » 2014-11-19 14:12 @633

Lo único que puedo recomendarte es buscar la forma de retornar el JSON de $result, sin usar el stash de Catalyst :(
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia


Volver a Básico

¿Quién está conectado?

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