2009-08-11 24 views
7

Estoy tratando de implementar una API RESTful en Perl. Mi idea actual es simplemente analizar el path_info con una expresión regular y luego enviar la solicitud a la subrutina apropiada, que luego escupirá el JSON, XML o incluso XHTML para el recurso solicitado.¿Cómo puedo implementar una API RESTful en Perl?

Por ejemplo para recuperar información sobre el usuario 1234 el cliente REST debe encontrar en:

http://example.com/model.pl/users/1234

A continuación se muestra el código esqueleto de mi primer intento de implementar un API REST:

model.pl:

#!/usr/bin/perl -w 
use strict; 
use CGI; 

my $q = CGI->new(); 

print $q->header('text/html'); 

my $restfuluri = $q->path_info; 

if  ($restfuluri =~ /^\/(questions)\/([1-9]+$)/) { questions($1, $2); } 
elsif ($restfuluri =~ /^\/(users)\/([1-9]+$)/)  { users($1, $2); } 


sub questions 
{ 
     my $object = shift; 
     my $value = shift; 

     #This is a stub, spits out JSON or XML when implemented. 
     print $q->p("GET question : $object -> $value"); 
} 

sub users 
{ 
     my $object = shift; 
     my $value = shift; 

     #This is a stub, spits out JSON or XML when implemented. 
     print $q->p("GET user: $object -> $value"); 
} 

Antes de seguir adelante, me gustaría saber de piratas informáticos Perl experimentados si obtuve la idea básica correcta y si hay algún inconveniente grave con este enfoque en términos de rendimiento.

Me puedo imaginar, después de un tiempo, el bloque if/else crecería realmente grande.

Esperamos escuchar sus opiniones para mejorar este código.

+2

¿Puedo sugerir que si el objetivo es construir una API REST que pasar algún más tiempo a aprender sobre el descanso . Las interfaces RESTful no se tratan de usar URL bonitas para entregar XML y JSCON. –

+0

Consulte otras preguntas sobre StackOverflow que explican REST en detalle. – aehlke

+0

Por favor, no me malinterpreten, sé lo que es REST y soy consciente de los usos y abusos de REST. Solo necesito una manera rápida y sucia de proporcionar una API RESTful para una aplicación heredada. Tiene una capa de datos bien desarrollada, lo único que tengo que hacer es permitir que las personas accedan a los datos formateados como JSON o XML utilizando URI bonitos. Mantengo cosas que tienen que ser más confiables que sexy. Tomé la iniciativa para leer el libro O'Reilly de los servicios web RESTful y la mayor parte del libro de Brian incluso antes de preguntar. Creo que esta es una pregunta legítima. Además, la mayoría de las discusiones hablan sobre Ruby. Gracias. – GeneQ

Respuesta

6

me gustaría utilizar algo así como CGI :: Application :: Despacho , me permite crear una tabla de distribución con variables y métodos REST, y te permite usar CGI y CGI :: Módulos de aplicación desde CPAN. Por ejemplo:

table => [ 
'/questions/:id[get]' => { rm => 'get_question' }, 
'/users/:id[get]'  => { rm => 'get_user' }, # OR 
':app/:id[post]'   => { rm => 'update' }, # where :app is your cgi application module 
':app/:id[delete]'  => { rm => 'delete' }, 
], 

(o puede utilizar auto_rest o auto_rest_lc)

puede utilizar un CGI :: Clase de aplicación separada para cada tipo de cosas (o simplemente utilizar las clases de métodos de su clase controlador de cgi-app)

CGI :: La aplicación también viene con complementos para generar XML, JSON o texto generado a partir de plantillas.

cgi-app (y c :: a :: d) son aplicaciones CGI y se pueden utilizar con (poco o) sin cambios bajo CGI, FastCGI o mod_perl. C :: A :: D también es un mod_perl PerlHandler por defecto también.

+0

Justo lo que necesito. Gracias. – GeneQ

-2
+0

Si está utilizando apache y mod_rewrite, ¿por qué incluso incluye el .pl? También estás perdiendo la identificación. Puede volver a escribir la URL con mod_rewrite o simplemente crear un controlador mod_perl y usarlo para manejar/dir/whatever. CGI :: Application :: Dispatch es un controlador mod_perl y puede hacer reposo. – MkV

1

construiría la aplicación utilizando Catalyst y Catalyst::Controller::REST

+0

Gracias. Pero pasaré. Nada en contra de Catalyst, esto es, sin embargo, proporcionar una interfaz RESTful a una (muy) aplicación heredada. Cosas rápidas y sucias. ;-) – GeneQ

15

Para las API REST livianas, me gustaría ver Mojolicious. El enrutamiento de solicitudes es muy sencillo y el renderizador incorporado de JSON y el agente de usuario hacen que el desarrollo de simples API de REST sea muy sencillo en mi experiencia.

Si su aplicación va a ser relativamente pequeña, entonces Mojo::Lite puede satisfacer sus requisitos.Por ejemplo, usted puede ser capaz de hacer algo como esto:

use Mojolicious::Lite; 

get '/questions/(:question_id)' => sub { 
    my $self = shift; 
    my $result = {}; 
    # do stuff with $result based on $self->stash('question_id') 
    return $self->render_json($result) 
} 

app->start; 
1

La solución más sencilla:

use CGI; 

my $page = new CGI; 

if($ENV{ 'REQUEST_METHOD' } eq 'GET'){ 

    my $data = <<json; 
    { 
    "isbn" : "123456", 
    "title" : "Programming Perl", 
    "author" : "L. Wall" 
    } 
json 

    print $page->header('application/json'); 

    print $data; 
} 
+0

Debido a que el documento aquí en su ejemplo no funciona debido al espaciado, p. – Jinxed

+0

¡Lo siento! Lo corrijo – Gerd

Cuestiones relacionadas