2009-08-11 13 views
7

मैं पर्ल में एक रीस्टफुल एपीआई लागू करने की कोशिश कर रहा हूं। मेरा वर्तमान विचार बस regex के साथ path_info को पार्स करना है, फिर उपयुक्त सबराउटिन को अनुरोध भेज दें जो अनुरोधित संसाधन के लिए JSON, XML या यहां तक ​​कि एक्सएचटीएमएल को थूक देगा।मैं पर्ल में एक विश्वसनीय API कैसे कार्यान्वित कर सकता हूं?

उदाहरण उपयोगकर्ता 1234 के बारे में जानकारी प्राप्त करने में लिए RESTful ग्राहक पर इसे खोजने चाहिए:

:

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

नीचे एक RESTful 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"); 
} 

आगे बढ़ने से पहले, मैं अनुभवी पर्ल हैकर्स से सुनना चाहता हूं कि मुझे मूलभूत विचार सही है और यदि प्रदर्शन के संदर्भ में इस दृष्टिकोण के साथ कोई गंभीर कमी है।

मैं कल्पना कर सकता हूं, थोड़ी देर बाद, अगर/अन्य ब्लॉक वास्तव में बड़ा हो जाएगा।

इस कोड को बेहतर बनाने के लिए अपने विचारों को सुनने के लिए तत्पर हैं।

+2

मैं सुझाव दे सकते हैं कि यदि आप उद्देश्य एक RESTful API कि आप बाकी के बारे में सीखने के लिए कुछ और अधिक समय बिताने का निर्माण होता है । अस्थायी इंटरफेस एक्सएमएल और जेएससीओएन वितरित करने के लिए सुंदर यूआरएल का उपयोग करने के बारे में नहीं हैं। –

+0

स्टैक ओवरव्लो पर अन्य प्रश्नों की जांच करें जो आरईएसटी को विस्तार से समझाते हैं। – aehlke

+0

कृपया मुझे गलत न करें, मुझे पता है कि आरईएसटी क्या है और मुझे आरईएसटी के उपयोग और दुरुपयोग के बारे में पता है। मुझे सिर्फ एक विरासत ऐप के लिए एक विश्वसनीय API प्रदान करने का एक त्वरित और गंदा तरीका चाहिए। इसमें एक अच्छी तरह से विकसित डेटा परत है, मुझे बस इतना करना है कि लोगों को सुंदर यूआरआई का उपयोग करके JSON या XML के रूप में स्वरूपित डेटा तक पहुंचने दें। मैं उन सामानों को बनाए रखता हूं जिन्हें सेक्सी से अधिक विश्वसनीय होना चाहिए। मैंने रीस्टफुल वेब सर्विसेज O'Reilly पुस्तक और ब्रायन की अधिकांश पुस्तकें पढ़ने से पहले भी जानबूझ कर लिया है। मुझे लगता है कि यह एक कानूनी सवाल है। इसके अलावा, अधिकांश चर्चा रूबी के बारे में बात करती है। धन्यवाद। दुर्भाग्य से, – GeneQ

उत्तर

6

मैं सीजीआई की तरह कुछ का प्रयोग करेंगे :: आवेदन :: डिस्पैच , यह मुझे चर और आरईएसटी विधियों के साथ एक प्रेषण तालिका बनाने देता है, और आप सीपीआई से सीजीआई और सीजीआई :: आवेदन मॉड्यूल का उपयोग करने देता है। उदाहरण के लिए:

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

(या आप auto_rest उपयोग कर सकते हैं या auto_rest_lc)

आप (बात के प्रत्येक प्रकार के लिए एक अलग सीजीआई :: आवेदन वर्ग का उपयोग कर सकते हैं या बस अपने cgi-एप्लिकेशन नियंत्रक वर्ग के तरीकों में कक्षाओं का उपयोग)।

सीजीआई :: एप्लिकेशन एक्सएमएल, जेएसओएन या टेम्पलेट से उत्पन्न पाठ को आउटपुट करने के लिए प्लगइन के साथ आता है।

सीजीआई-एप (और सी :: ए :: डी) सीजीआई अनुप्रयोग हैं और सीजीआई, फास्टसीजीआई या mod_perl के तहत (छोटे या) कोई बदलाव नहीं किया जा सकता है। सी :: ए :: डी डिफ़ॉल्ट रूप से एक mod_perl PerlHandler भी है।

+0

बस मुझे क्या चाहिए। धन्यवाद। – GeneQ

-2

आप apache mod_rewrite का उपयोग क्यों नहीं करते?

पुनर्निर्देशन http://mysite.com/model.pl/users/1234 ->http://mysite.com/users.pl

पुनर्निर्देशन http://mysite.com/model.pl/q/5678 ->http://mysite.com/questions.pl

+0

यदि आप अपाचे और mod_rewrite का उपयोग कर रहे हैं, तो .pl क्यों शामिल करें? इसके अलावा आप आईडी खो रहे हैं। आप mod_rewrite के साथ यूआरएल को फिर से लिख सकते हैं या सिर्फ एक mod_perl हैंडलर बना सकते हैं और इसे/डीआईआर/जो कुछ भी संभालने के लिए इस्तेमाल कर सकते हैं। सीजीआई :: एप्लीकेशन :: डिस्पैच एक mod_perl हैंडलर है, और बाकी कर सकता है। – MkV

1

मैं Catalyst और Catalyst::Controller::REST का उपयोग कर आवेदन का निर्माण होता

+0

धन्यवाद। लेकिन मैं पास करूंगा। उत्प्रेरक के खिलाफ कुछ भी नहीं, यह एक बहुत ही विरासत ऐप के लिए एक विश्वसनीय इंटरफ़ेस प्रदान करता है। त्वरित और गंदे सामान। ;-) – GeneQ

1

पहले से लागू मॉड्यूल Apache2::REST का उपयोग क्यों नहीं करें? यह सब वहाँ है।

15

हल्के आरईएसटी एपीआई के लिए मैं Mojolicious को देखता हूं। अनुरोध रूटिंग वास्तव में सीधा है और इनबिल्ट जेएसओएन रेंडरर और उपयोगकर्ता एजेंट सरल आरईएसटी एपीआई के विकास को मेरे अनुभव में बहुत सरल बनाते हैं।

यदि आपका ऐप अपेक्षाकृत छोटा होने वाला है तो Mojo::Lite आपकी आवश्यकताओं के अनुरूप हो सकता है।उदाहरण के लिए आप कुछ इस तरह करने में सक्षम हो सकता है:

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

सरल उपाय:

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

क्योंकि आपके उदाहरण में यहां-दस्तावेज़ अंतर के कारण काम नहीं करता है, उदा। – Jinxed

+0

क्षमा करें! मैं इसे सही करता हूँ। – Gerd

संबंधित मुद्दे