Página 1 de 1

JSON con Catalyst, en Perl

NotaPublicado: 2014-11-17 12:33 @564
por neoranger
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.002 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.

Re: JSON con Catalyst, en Perl

NotaPublicado: 2014-11-18 08:38 @401
por neoranger
¿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.

Re: JSON con Catalyst, en Perl

NotaPublicado: 2014-11-18 21:01 @917
por danimera
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.

Re: JSON con Catalyst, en Perl

NotaPublicado: 2014-11-19 08:14 @385
por neoranger
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

Re: JSON con Catalyst, en Perl

NotaPublicado: 2014-11-19 09:24 @434
por neoranger
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.

Re: JSON con Catalyst, en Perl

NotaPublicado: 2014-11-19 09:40 @444
por danimera
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.

Re: JSON con Catalyst, en Perl

NotaPublicado: 2014-11-19 11:03 @502
por neoranger
Si, ya tratamos de retornar solo $resulta y no funciona.

Re: JSON con Catalyst, en Perl

NotaPublicado: 2014-11-19 12:27 @561
por danimera
Cuando dices que no funciona deberías decir qué mensaje de error o qué sale.

Re: JSON con Catalyst, en Perl

NotaPublicado: 2014-11-19 12:48 @575
por neoranger
Sale un error de JavaScript indicando error en el JSON configurado.

Re: JSON con Catalyst, en Perl

NotaPublicado: 2014-11-19 14:12 @633
por danimera
Lo único que puedo recomendarte es buscar la forma de retornar el JSON de $result, sin usar el stash de Catalyst :(