Página 1 de 2

Servicios web con filosofia REST

NotaPublicado: 2011-06-22 12:33 @564
por scout
Bueno, habiendo explorado la opción de SOAP & Perl, me interesaría armar un servicio web en Perl con filosofía REST (digo así pero es un nuevo concepto para mi) que según la definición y recomendaciones en estos foros es interesante tener en cuenta…

Por ello agradeceré si alguno realizó un servicio web o cuenta con algún ejemplo para poder montarlo y luego armar el cliente… adecuado.

Existen dos filosofías a la hora de escribir servicios web:

• REST: utiliza XML, JSON y HTTP. Cada URL representa un objeto sobre el que puedes realizar POST, GET, PUT y DELETE (las operaciones típicas del HTTP).

• SOAP: es toda una infraestructura basada en XML, donde cada objeto puede tener métodos definidos por el programador con los parámetros que sean necesarios.

Re: Servicios web con filosofia REST

NotaPublicado: 2011-06-22 13:15 @594
por chsanch
En el trabajo hicimos algo en este estilo, una aplicación web que consultaba a un LDAP para proveer un sistema SSO contra un servidor CAS.

Usamos Dancer como base, para ofrecer varios métodos REST, y las respuestas las envía en formato JSON, ya Dancer trae un serializador para este tipo de estructuras. En realidad es bastante sencillo crear una aplicación de este tipo y más con estas herramientas. Dale un vistazo al Dancer::Plugin::REST, eso puede facilitarte mucho más el desarrollo.

Saludos.

Re: Servicios web con filosofia REST

NotaPublicado: 2011-06-23 18:35 @816
por scout
¡Qué bueno, si conectaste con un LDAP...! Sigo buscando más teoría para lograr entender bien su funcionamiento...
ya que tengo las siguientes preguntas..
1_ ¿El código servidor va en alguna carpeta especial del webserver ?
2_ ¿A nivel cliente cómo te lograste conectar, tienes algún ejemplo??


Seguiré buscando información al respecto.
Muchas gracias por responder...

Re: Servicios web con filosofia REST

NotaPublicado: 2011-06-24 14:09 @631
por scout
Estoy siguiendo la línea de Dancer con la idea de montar al menos un servicio que me permita obtener una respuesta pero no logro entenderlo... encontré este ejemplo pero no sé si voy por buen camino. El que tenga un ejemplo de servidor con una simple función se lo agradeceré. Me servirá para entender cómo va este tema...

Ejemplo encontrado

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. package MyApp;
  2.  
  3. use Dancer ':syntax';
  4. use Dancer::Plugin::Cache;
  5.  
  6. # caching pages' response
  7. check_page_cache;
  8.  
  9. # this page will be automatically cached
  10. get '/cache_me' => sub {
  11.     cache_page template 'foo';
  12. };
  13.  
  14. # but not this one
  15. get '/uncached' => sub {
  16.     template 'bar';
  17. };
  18.  
  19. # using our helper functions
  20.  
  21. get '/clear' => sub {
  22.     cache_clear;
  23. };
  24.  
  25. put '/stash' => sub {
  26.     cache_set secret_stash => request->body;
  27. };
  28.  
  29. get '/stash' => sub {
  30.     return cache_get 'secret_stash';
  31. };
  32.  
  33. # using the cache directly
  34.  
  35. get '/something' => sub {
  36.     my $thingy = cache->compute( 'thingy', sub { compute_thingy() } );
  37.  
  38.     return template 'foo' => { thingy => $thingy };
  39. };
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

Re: Servicios web con filosofia REST

NotaPublicado: 2011-06-24 14:34 @649
por chsanch
Lo mejor es que leas el tutorial; con ese ejemplo puedes empezar a trabajar y aprender lo básico de cómo funciona Dancer Dancer::Tutorial.

Saludos

Re: Servicios web con filosofia REST

NotaPublicado: 2011-06-24 18:58 @832
por scout
muchas gracias estoy con ello....

Re: Servicios web con filosofia REST

NotaPublicado: 2011-06-26 01:36 @108
por scout
¡Aaahhh, me está comenzando a gustar el Dancer! Resumiendo, el "hola mundo" ( para los duros de pelar como yo ) y planteando preguntas... sigo con los ejemplos del tutorial... mientras tanto...

1_ en un script pongo el código de "hola mundo".

use Dancer;
get '/' => sub {
return 'Hello World!';
};
start;

2_ ejecuto el script desde perl
3_ abro el explorador y en http://localhost:3000/
4_ se ve el "hola mundo"

Preguntas de novato...

1_ ¿cómo te aseguras que el script estará siempre en start o qué medidas tomas para que no caiga?
2_ ¿cómo cambias de puerto ya que el 3000 es lindo número pero seguramente se querrá modificar?

Re: Servicios web con filosofia REST

NotaPublicado: 2011-06-26 06:31 @313
por explorer
scout escribiste:1_ ¿cómo te aseguras que el script estará siempre en start o qué medidas tomas para que no caiga?
Eso es lo mismo que decir qué medidas tomas para saber si Apache sigue funcionando... En la mayor parte de los casos, confías en Perl. Si estás en un sistema de producción muy serio, entonces te vale con poner un programa monitor, que te avise de que ha caído el servicio, o mejor aún, que lo intente levantar de nuevo. Lo pones en un cron o Tarea programada, y que cada X minutos compruebe (haciendo un get, por ejemplo) si está arriba.
scout escribiste:2_ ¿cómo cambias de puerto ya que el 3000 es lindo número pero seguramente se querrá modificar?
Lo tienes explicado en Dancer::Config, al principio, en SETTINGS, tienes un ejemplo. O poniéndolo en la línea de comandos, en la ejecución del programa, con la opción --port=número. Mira en Dancer::Introduction, sección RUNNING THE WEBSERVER.

Re: Servicios web con filosofia REST

NotaPublicado: 2011-06-26 10:43 @488
por chsanch
scout escribiste:Preguntas de novato...

1_ ¿cómo te aseguras que el script estará siempre en start o qué medidas tomas para que no caiga?
2_ ¿cómo cambias de puerto ya que el 3000 es lindo número pero seguramente se querrá modificar?


Ese script que estás usando es solamente para usarlo en la etapa de desarrollo, luego cuando lo llevas tu aplicación a producción necesitas usar algo más robusto. Revisa Dancer::Deployment para que veas las formas en que puedes poner tu aplicación en desarrollo.

Re: Servicios web con filosofia REST

NotaPublicado: 2011-06-26 11:07 @505
por scout
Gracias explorer y chsanch. Disculpen por las preguntas tan básicas; siempre voy aprendiendo cosas nuevas.

Ahora mismo estoy tratando de simular el ejemplo que hay en el tutorial con la base de datos MySQL... ya tengo montada la base de datos, la tabla, los módulos requeridos por el ejemplo y las carpetas y archivos y utilizando el código del autor pero me aparece un error que no puedo solucionar... y ya desde el editor marca error de código y no lo puedo encontrar… cerca de las líneas “before_template sub”…

En fin, si logro hacer que esto camine y tenga todo documentado me pondré con el Dancer::Deployment y a plantearme objetivos más interesantes.

Error
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
C:\perl\dancer\source>perl dancr.pl
"my" variable $tokens masks earlier declaration in same scope at dancr.pl line 51, <DATA> line 16.
"my" variable $tokens masks earlier declaration in same scope at dancr.pl line 52, <DATA> line 16.
"my" variable $tokens masks earlier declaration in same scope at dancr.pl line 53, <DATA> line 16.
syntax error at dancr.pl line 48, near "before_template sub "syntax error at dancr.pl line 54, near "}"
Execution of dancr.pl aborted due to compilation errors.
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Código del autor completo:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use Dancer;
  2. use DBI;
  3. use File::Spec;
  4. use File::Slurp;
  5. use Template;
  6.  
  7. set 'database'     => File::Spec->tmpdir() . '/dancr.db';
  8. set 'session'      => 'Simple';
  9. set 'template'     => 'template_toolkit';
  10. set 'logger'       => 'console';
  11. set 'log'          => 'debug';
  12. set 'show_errors'  => 1;
  13. set 'startup_info' => 1;
  14. set 'warnings'     => 1;
  15. set 'username'     => 'admin';
  16. set 'password'     => 'password';
  17. set 'layout'       => 'main';
  18.  
  19. my $flash;
  20.  
  21. sub set_flash {
  22.     my $message = shift;
  23.  
  24.     $flash = $message;
  25. }
  26.  
  27. sub get_flash {
  28.  
  29.     my $msg = $flash;
  30.     $flash = "";
  31.  
  32.     return $msg;
  33. }
  34.  
  35. sub connect_db {
  36.     my $dbh = DBI->connect( "dbi:SQLite:dbname=" . setting('database') )
  37.         or die $DBI::errstr;
  38.  
  39.     return $dbh;
  40. }
  41.  
  42. sub init_db {
  43.     my $db     = connect_db();
  44.     my $schema = read_file('./schema.sql');
  45.     $db->do($schema) or die $db->errstr;
  46. }
  47.  
  48. before_template sub {
  49.     my $tokens = shift;
  50.  
  51.     $tokens->{'css_url'}    = request->base . 'css/style.css';
  52.     $tokens->{'login_url'}  = uri_for('/login');
  53.     $tokens->{'logout_url'} = uri_for('/logout');
  54. };
  55.  
  56. get '/' => sub {
  57.     my $db  = connect_db();
  58.     my $sql = 'select id, title, text from entries order by id desc';
  59.     my $sth = $db->prepare($sql) or die $db->errstr;
  60.     $sth->execute or die $sth->errstr;
  61.     template 'show_entries.tt',
  62.         {
  63.         'msg'           => get_flash(),
  64.         'add_entry_url' => uri_for('/add'),
  65.         'entries'       => $sth->fetchall_hashref('id'),
  66.         };
  67. };
  68.  
  69. post '/add' => sub {
  70.     if ( not session('logged_in') ) {
  71.         send_error( "Not logged in", 401 );
  72.     }
  73.  
  74.     my $db  = connect_db();
  75.     my $sql = 'insert into entries (title, text) values (?, ?)';
  76.     my $sth = $db->prepare($sql) or die $db->errstr;
  77.     $sth->execute( params->{'title'}, params->{'text'} ) or die $sth->errstr;
  78.  
  79.     set_flash('New entry posted!');
  80.     redirect '/';
  81. };
  82.  
  83. any [ 'get', 'post' ] => '/login' => sub {
  84.     my $err;
  85.  
  86.     if ( request->method() eq "POST" ) {
  87.  
  88.         # process form input
  89.         if ( params->{'username'} ne setting('username') ) {
  90.             $err = "Invalid username";
  91.         }
  92.         elsif ( params->{'password'} ne setting('password') ) {
  93.             $err = "Invalid password";
  94.         }
  95.         else {
  96.             session 'logged_in' => true;
  97.             set_flash('You are logged in.');
  98.             return redirect '/';
  99.         }
  100.     }
  101.  
  102.     # display login form
  103.     template 'login.tt', { 'err' => $err, };
  104.  
  105. };
  106.  
  107. get '/logout' => sub {
  108.     session->destroy;
  109.     set_flash('You are logged out.');
  110.     redirect '/';
  111. };
  112.  
  113. init_db();
  114. start;
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4