如何在Perl中使用REST API发布json文件?



有一个应用程序每天生成多个记录,包含不同类型的属性,如EmpName,EmpDesig等,并以JSON格式存储。 然后,此应用程序需要调用外部 REST api,以 JSON 格式发布此数据。 外部应用程序将读取 JSON 文件,对其进行解析,并将每条记录存储在 PostgreSQL 数据库中。 如何在Perl中编写REST api来满足此要求?我是否需要任何像Mojolicious或Catalyst这样的Perl框架或像JSON,Rest::Client这样的Perl模块就足以满足这个要求?请指教。

如果你确实想使用框架,它会大大简化你的代码。

你可以在一行中使用 Dancer 框架来做到这一点:

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

然而,这个答案只是一个开始,它并不强大,也不包含任何检查。

你并不严格需要一个框架。最简单的方法是开始使用 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;
};

最新更新