2009-08-11 20 views
7

Próbuję zaimplementować RESTful API w Perlu. Moim aktualnym pomysłem jest po prostu przeanalizowanie parametru ścieżka_info za pomocą wyrażenia regularnego, a następnie wysłanie żądania do odpowiedniego podprogramu, który następnie wypluje JSON, XML lub nawet XHTML dla żądanego zasobu.Jak mogę wdrożyć RESTful API w Perlu?

Na przykład w celu pobrania informacji o Użytkowniku 1234 relaksującego klient powinien go znaleźć pod adresem:

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

Poniżej znajduje się kod szkielet moja pierwsza próba wdrożenia REST API:

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"); 
} 

Zanim przejdę dalej, chciałbym usłyszeć od doświadczonych hakerów Perla, czy mam podstawowy pomysł w porządku i czy są jakieś poważne niedociągnięcia w tym podejściu pod względem wydajności.

Mogę sobie wyobrazić, że po pewnym czasie blok if/else stanie się naprawdę duży.

Czekamy na Twoje opinie, aby poprawić ten kod.

+2

mogę zasugerować, że jeśli celem jest zbudowanie REST API, które można spędzić trochę więcej czasu na naukę o odpoczynku . Interfejsy RESTful nie używają ładnych adresów URL do dostarczania XML i JSCON. –

+0

Sprawdź inne pytania dotyczące StackOverflow, które wyjaśniają szczegółowo REST. – aehlke

+0

Proszę nie zrozumcie mnie źle, wiem, co to jest REST i jestem świadomy zastosowań i nadużywania REST. Potrzebuję tylko szybkiego i brudnego sposobu dostarczania RESTful API dla starszej aplikacji. Ma dobrze rozwiniętą warstwę danych, wszystko co muszę zrobić, to umożliwić ludziom dostęp do danych sformatowanych jako JSON lub XML przy użyciu ładnych URI. Utrzymuję rzeczy, które muszą być bardziej wiarygodne niż seksowne. Interesowałem się czytaniem książki o usługach RESTful Web Services O'Reilly i większości książek Briana, zanim nawet się o to zapytałem. Myślę, że to jest uzasadnione pytanie. Ponadto większość dyskusji mówi o Ruby. Dzięki. – GeneQ

Odpowiedz

6

chciałbym użyć czegoś podobnego CGI :: Application :: Dispatch , pozwala mi tworzyć tabelę wysyłkową ze zmiennymi i metodami REST, a także umożliwia korzystanie z CGI i CGI :: Moduły aplikacji z CPAN. Np:

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' }, 
], 

(lub można użyć auto_rest lub auto_rest_lc)

można użyć oddzielny CGI :: klasę aplikacji dla każdego rodzaju rzeczy (lub po prostu użyć klas w swoich metodach cgi aplikacji klasy kontroler).

CGI :: Aplikacja zawiera również wtyczki do wyprowadzania XML, JSON lub tekstu generowanego z szablonów.

cgi-app (i c :: a :: d) są aplikacjami CGI i mogą być używane z (małe lub) bez zmian w CGI, FastCGI lub mod_perl. C :: A :: D to także domyślnie perlHandler mod_perl.

+0

Właśnie tego potrzebuję. Dzięki. – GeneQ

-2
+0

Jeśli używasz Apache i Mod_rewrite, dlaczego nawet dołączyć .pl? Również tracisz identyfikator. Możesz przepisać adres URL za pomocą mod_rewrite lub po prostu stworzyć moduł obsługi mod_perl i użyć go do obsługi/dir/cokolwiek. CGI :: Aplikacja :: Dispatch jest modułem obsługi mod_perl i może zrobić odpoczynek. – MkV

1

Chciałbym zbudować aplikację za pomocą Catalyst i Catalyst::Controller::REST

+0

Dzięki. Ale przejdę. Nic nie przeciwko Catalyst, to jest jsut ot zapewnia RESTful interfejs do (bardzo) starszej aplikacji. Szybkie i brudne rzeczy. ;-) – GeneQ

15

W przypadku lekkich interfejsów REST API powinienem spojrzeć na Mojolicious. Routing żądań jest naprawdę prosty, a wbudowany renderer JSON i agent użytkownika tworzą proste interfejsy API REST bardzo prosto z mojego doświadczenia.

Jeśli twoja aplikacja będzie stosunkowo mała, to Mojo::Lite może odpowiadać twoim wymaganiom.Na przykład może być w stanie zrobić coś takiego:

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

Proste rozwiązanie:

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

Ponieważ dokument tutaj w twoim przykładzie nie działa z powodu odstępów, np. – Jinxed

+0

Przepraszamy! Poprawiam to. – Gerd