2009-08-11 38 views
7

Tôi đang cố triển khai API RESTful trong Perl. Ý tưởng hiện tại của tôi là phân tích cú pháp path_info với một regex sau đó gửi yêu cầu tới chương trình con thích hợp, sau đó sẽ rút ra JSON, XML hoặc thậm chí XHTML cho tài nguyên được yêu cầu.Làm cách nào để triển khai API RESTful trong Perl?

Ví dụ để lấy thông tin về người sử dụng 1234 client RESTful nên tìm thấy nó tại địa chỉ:

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

Dưới đây là mã bộ xương của nỗ lực đầu tiên của tôi tại thực hiện một API RESTful:

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

Trước khi tiếp tục, tôi muốn nghe tin từ các tin tặc Perl giàu kinh nghiệm dù tôi có ý tưởng cơ bản đúng không và nếu có bất kỳ thiếu sót nghiêm trọng nào với phương pháp này về hiệu suất.

Tôi có thể tưởng tượng, sau một thời gian, khối if/else sẽ phát triển rất lớn.

Mong muốn được nghe quan điểm của bạn để làm cho mã này tốt hơn.

+2

Tôi có thể gợi ý rằng nếu bạn Mục tiêu là xây dựng một API RESTful bạn nên dành chút thời gian hơn học về REST . Các giao diện RESTful không sử dụng các URL đẹp để phân phối XML và JSCON. –

+0

Kiểm tra các câu hỏi khác trên StackOverflow để giải thích chi tiết REST. – aehlke

+0

Xin vui lòng không làm cho tôi sai, tôi biết REST là gì và tôi nhận thức được việc sử dụng và lạm dụng của REST. Tôi chỉ cần một cách nhanh chóng và dơ bẩn để cung cấp API RESTful cho ứng dụng cũ. Nó có một lớp dữ liệu phát triển tốt, tất cả những gì tôi cần làm là cho phép mọi người truy cập dữ liệu được định dạng là JSON hoặc XML bằng cách sử dụng các URI đẹp. Tôi duy trì những thứ đáng tin cậy hơn sexy. Tôi đã lấy intiative để đọc các dịch vụ Web RESTful O'Reilly cuốn sách và hầu hết các cuốn sách của Brian trước khi thậm chí yêu cầu. Tôi nghĩ rằng đây là một câu hỏi hợp pháp. Hơn nữa, hầu hết các cuộc thảo luận đều nói về Ruby. Cảm ơn. – GeneQ

Trả lời

6

Tôi sẽ sử dụng một cái gì đó giống như CGI :: Ứng dụng :: Dispatch , nó cho phép tôi xây dựng một bảng điều phối với các biến và phương thức REST, và cho phép bạn sử dụng CGI và CGI :: Các mô-đun ứng dụng từ CPAN. Ví dụ:

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

(hoặc bạn có thể sử dụng auto_rest hoặc auto_rest_lc)

bạn có thể sử dụng một CGI riêng :: lớp ứng dụng đối với từng loại điều (hoặc chỉ cần sử dụng các lớp trong cgi-ứng dụng phương pháp lớp điều khiển của bạn).

CGI :: Ứng dụng cũng đi kèm với các plugin để xuất XML, JSON hoặc văn bản được tạo từ mẫu.

cgi-app (và c :: a :: d) là các ứng dụng CGI và có thể được sử dụng với (ít hoặc) không thay đổi theo CGI, FastCGI hoặc mod_perl. C :: A :: D cũng là một mod_perl PerlHandler theo mặc định.

+0

Chỉ cần những gì tôi cần. Cảm ơn. – GeneQ

-2
+0

Nếu bạn đang sử dụng apache và mod_rewrite, tại sao thậm chí bao gồm .pl? Ngoài ra bạn đang mất ID. Bạn có thể viết lại URL bằng mod_rewrite hoặc chỉ cần tạo một trình xử lý mod_perl và sử dụng nó để xử lý/dir/bất cứ điều gì. CGI :: Application :: Dispatch là một trình xử lý mod_perl, và có thể làm phần còn lại. – MkV

1

Tôi muốn xây dựng các ứng dụng sử dụng CatalystCatalyst::Controller::REST

+0

Cảm ơn. Nhưng tôi sẽ vượt qua. Không có gì chống lại Catalyst, đây là jsut ot cung cấp giao diện RESTful cho một ứng dụng kế thừa (rất). Công cụ nhanh & bẩn. ;-) – GeneQ

1

Tại sao không sử dụng mô-đun đã được triển khai Apache2::REST? Đó là tất cả ở đó.

15

Đối với các API REST nhẹ tôi sẽ xem xét Mojolicious. Việc định tuyến yêu cầu thực sự đơn giản và trình kết xuất JSON và tác nhân người dùng sẵn có giúp phát triển các API REST đơn giản rất đơn giản trong trải nghiệm của tôi.

Nếu ứng dụng của bạn sẽ tương đối nhỏ thì Mojo::Lite có thể phù hợp với yêu cầu của bạn.Ví dụ, bạn có thể làm điều gì đó như thế này:

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

Giải pháp đơn giản:

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

Do tài liệu ở đây trong ví dụ của bạn không hoạt động do khoảng trắng, ví dụ: – Jinxed

+0

Xin lỗi! Tôi sửa nó. – Gerd

Các vấn đề liên quan