Как я могу реализовать RESTful API в Perl? - PullRequest
8 голосов
/ 11 августа 2009

Я пытаюсь реализовать RESTful API в Perl. Моя текущая идея - просто проанализировать path_info с помощью регулярного выражения, а затем отправить запрос в соответствующую подпрограмму, которая затем выдаст JSON, XML или даже XHTML для запрошенного ресурса.

Например, чтобы получить информацию о пользователе 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");
}

Прежде чем я продолжу, я хотел бы услышать от опытных Perl-хакеров, правильно ли я понял основную идею и есть ли какие-либо серьезные недостатки этого подхода с точки зрения производительности.

Я могу представить, что через некоторое время блок if / else станет очень большим.

Будем рады услышать ваше мнение, чтобы сделать этот код лучше.

Ответы [ 7 ]

16 голосов
/ 22 февраля 2013

Для легких REST API я бы посмотрел на Mojolicious. Маршрутизация запросов действительно проста, а встроенный JSON-рендер и пользовательский агент делают разработку простых REST API очень простой в моем опыте.

Если ваше приложение будет относительно небольшим, тогда 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;
8 голосов
/ 11 августа 2009

Я бы использовал что-то вроде CGI :: Application :: Dispatch, он позволяет мне создавать таблицу диспетчеризации с переменными и методами REST и позволяет использовать модули CGI и CGI :: Application из CPAN. E.g.:

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 :: Application для каждого типа вещей (или просто использовать классы в ваших методах класса контроллера cgi-app).

CGI :: Приложение также поставляется с плагинами для вывода XML, JSON или текста, сгенерированного из шаблонов.

cgi-app (и c :: a :: d) являются CGI-приложениями и могут использоваться (без изменений или без изменений) в CGI, FastCGI или mod_perl. C :: A :: D также по умолчанию также является PerlHandler mod_perl.

1 голос
/ 22 февраля 2013

Почему бы не использовать уже реализованный модуль Apache2 :: REST ? Это все там.

1 голос
/ 11 августа 2009

Я бы собрал приложение, используя Catalyst и Catalyst :: Controller :: REST

0 голосов
/ 12 февраля 2019

Простое решение - с переменной настройкой на $data с использованием qq~~; Сохраняет весь код в очереди.

 use CGI;

 my $page  = new CGI;

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

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

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

     print $data;
 }
0 голосов
/ 12 ноября 2014

Простое решение:

 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 голосов
/ 11 августа 2009

Почему вы не используете 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...