• Publicidad

Servicios web con filosofia REST

¿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.

Servicios web con filosofia REST

Notapor scout » 2011-06-22 12:33 @564

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.
scout
Perlero nuevo
Perlero nuevo
 
Mensajes: 228
Registrado: 2009-10-28 13:50 @618

Publicidad

Re: Servicios web con filosofia REST

Notapor chsanch » 2011-06-22 13:15 @594

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.
chsanch
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2010-12-02 19:43 @863
Ubicación: Madrid

Re: Servicios web con filosofia REST

Notapor scout » 2011-06-23 18:35 @816

¡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...
scout
Perlero nuevo
Perlero nuevo
 
Mensajes: 228
Registrado: 2009-10-28 13:50 @618

Re: Servicios web con filosofia REST

Notapor scout » 2011-06-24 14:09 @631

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.002 segundos, usando GeSHi 1.0.8.4
Última edición por explorer el 2011-06-25 03:23 @183, editado 1 vez en total
Razón: Marcas Perl
scout
Perlero nuevo
Perlero nuevo
 
Mensajes: 228
Registrado: 2009-10-28 13:50 @618

Re: Servicios web con filosofia REST

Notapor chsanch » 2011-06-24 14:34 @649

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
chsanch
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2010-12-02 19:43 @863
Ubicación: Madrid

Re: Servicios web con filosofia REST

Notapor scout » 2011-06-24 18:58 @832

muchas gracias estoy con ello....
scout
Perlero nuevo
Perlero nuevo
 
Mensajes: 228
Registrado: 2009-10-28 13:50 @618

Re: Servicios web con filosofia REST

Notapor scout » 2011-06-26 01:36 @108

¡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?
scout
Perlero nuevo
Perlero nuevo
 
Mensajes: 228
Registrado: 2009-10-28 13:50 @618

Re: Servicios web con filosofia REST

Notapor explorer » 2011-06-26 06:31 @313

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.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14477
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Servicios web con filosofia REST

Notapor chsanch » 2011-06-26 10:43 @488

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.
chsanch
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2010-12-02 19:43 @863
Ubicación: Madrid

Re: Servicios web con filosofia REST

Notapor scout » 2011-06-26 11:07 @505

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.003 segundos, usando GeSHi 1.0.8.4
Última edición por explorer el 2011-06-26 17:26 @768, editado 1 vez en total
Razón: Marcas de texto y Perl
scout
Perlero nuevo
Perlero nuevo
 
Mensajes: 228
Registrado: 2009-10-28 13:50 @618

Siguiente

Volver a Intermedio

¿Quién está conectado?

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