Как POST-файл JSON, используя REST API в Perl? - PullRequest
0 голосов
/ 23 октября 2019

Существует приложение, которое генерирует несколько записей в день, содержащих различные типы атрибутов, таких как EmpName, EmpDesig и т. Д., И сохраняет их в формате JSON. Затем этому приложению необходимо выполнить вызов внешнего API REST для отправки этих данных в формате JSON. Внешнее приложение будет читать файл JSON, анализировать его и сохранять каждую запись в базе данных PostgreSQL. Как мне написать REST API в Perl для этого требования? Нужен ли какой-либо Perl-фреймворк, такой как Mojolicious или Catalyst, или Perl-модули, такие как JSON, Rest :: Client, достаточно для этого требования? Пожалуйста, предложите.

Ответы [ 2 ]

2 голосов
/ 23 октября 2019

Если вы захотите использовать фреймворк, это сильно упростит ваш код.

Вы можете сделать это с фреймворком Dancer в одну строку:

perl -e 'use Dancer; any "/", sub{ warn to_dumper from_json request->body; return "ok" }; start'

Однако этот ответ - только начало, он не надежен и не содержит никаких проверок.

1 голос
/ 23 октября 2019

Вам не нужны рамки. Начать проще всего с Plack :: Request . Следующим шагом будет добавление маршрутизатора типа Router :: Resource . Обновление до фреймворка имеет смысл, когда вы находите этот стиль программирования слишком утомительным.

use Plack::Request qw();
use HTTP::Status qw(
    HTTP_NO_CONTENT HTTP_NOT_FOUND HTTP_METHOD_NOT_ALLOWED
    HTTP_UNSUPPORTED_MEDIA_TYPE HTTP_UNPROCESSABLE_ENTITY
    HTTP_INTERNAL_SERVER_ERROR
);
use JSON::MaybeXS qw(decode_json);
use Syntax::Keyword::Try;
require IO::Handle;
use DBI qw();
require DBD::Pg;

my $app = sub {
    my ($env) = @_;
    my $req = Plack::Request->new($env);
    return $req->new_response(HTTP_NOT_FOUND)->finalize
        unless '/receive_json' eq $req->path_info;
    return $req->new_response(HTTP_METHOD_NOT_ALLOWED)->finalize
        unless 'POST' eq $req->method;
    return $req->new_response(HTTP_UNSUPPORTED_MEDIA_TYPE)->finalize
        unless $req->content_type =~ m'^application/.*json$';
    my $body = do {
        IO::Handle->input_record_separator(undef);
        $req->input->getline;
    };
    my $json;
    try {
        $json = decode_json $body;
    } catch {
        warn "could not decode JSON: $@";
        return $req->new_response(HTTP_UNPROCESSABLE_ENTITY)->finalize;
    }
    my $dbh;
    try {
        $dbh = DBI->connect(
            "dbi:Pg:dbname=$ENV{PGDATABASE}",
            $ENV{PGUSER},
            $ENV{PGPASSWORD},
            {pg_enable_utf8 => 1, RaiseError => 1}
        );
    } catch {
        warn "could not connect to database: $@";
        return $req->new_response(HTTP_INTERNAL_SERVER_ERROR)->finalize;
    }
    my $sth = $dbh->prepare(
        'insert into sometable(EmpName, EmpDesig) values (?,?)'
    );
    try {
        $sth->execute($json->{EmpName}, $json->{EmpDesig});
    } catch {
        warn "could not insert: $@";
        return $req->new_response(HTTP_INTERNAL_SERVER_ERROR)->finalize;
    }
    return $req->new_response(HTTP_NO_CONTENT)->finalize;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...