С 1.22.00.
В данной статье описано программный интерфейс всего API, как и со стороны модуля так и ядра.
Объект пути
{ # HTTP метод, GET, POST, PUT, PATCH, DELETE method => 'POST', # Абсолютный путь, за которым можно будет достучаться, например billing.url/api.cgi/portal/articles # для USER API обязательно должно начинаться с /user/* # В пути определяются основные параметры, по типу :id, :uid, которое отобразятся в пути path => '/portal/articles/', # "Контроллер" для API /portal/articles/* controller => 'Portal::Api::admin::Articles', # Ссылка на функцию-эндпойнт контроллера endpoint => \&Portal::Api::admin::Articles::post_portal_articles, credentials => [ # Параметры авторизации ADMIN API # ADMIN - API_KEY # ADMINSID - admin_sid по cookie (в том числе для api_call) 'ADMIN', 'ADMINSID' # Параметры авторизации USER API # USER - через header, полученном с /user/login # USERSID - через cookie (в том числе для api_call) # PUBLIC - без авторизации # Тоесть, в данном случае путь может работать как и с авторизованными пользователями, так и нет. # Внутри хэндлера можно определять какой пользователь. ] },
Контроллер
# Пэкэдэ <Module>::Api::(admin | user)::<Controller> package Portal::Api::admin::Articles; =head1 NAME Portal articles manage Endpoints: /portal/articles/* =cut use strict; use warnings FATAL => 'all'; # Словарь ошибок use Control::Errors; # Грузим нужные депенденси для этого контроллера use Portal; # Создаём объект словаря ошибок my Control::Errors $Errors; # Создаём объект(ы) депенденси my Portal $Portal; # Дополнительно: определяем permissions my %permissions = (); #********************************************************** =head2 new($db, $admin, $conf) =cut #********************************************************** sub new { my ($class, $db, $admin, $conf, $attr) = @_; my $self = { db => $db, admin => $admin, conf => $conf, attr => $attr }; %permissions = %{$attr->{permissions} || {}}; bless($self, $class); # Определяем депенденси $Portal = Portal->new($db, $admin, $conf); # Забираем "предустановленный" словарь ошибок $Errors = $self->{attr}->{Errors}; return $self; } # И дальше пишем пути # 1;
Определение пути
#********************************************************** =head2 delete_portal_articles_id($path_params, $query_params) Endpoint DELETE /portal/articles/:id/ =cut #********************************************************** sub delete_portal_articles_id { my $self = shift; my ($path_params, $query_params) = @_; # В $path_params находятся переменные которые определены путём # Например, /portal/articles/:id/ будет иметь параметр $path_params->{id} # в $query_params находятся параметры которые пришли с query # например: /portal/articles/?title=test # или c json/form body # например: POST /portal/articles { "title": "test" } my $list = $Portal->portal_articles_list({ ID => $path_params->{id}, COLS_NAME => 1 }); if (!($list && scalar(@$list))) { # Пример пробрасывания ошибки return $Errors->throw_error(1440002, { lang_vars => { ID => $path_params->{id} }}); } my $result = $Portal->portal_article_del({ ID => $path_params->{id} }); if (!$Portal->{errno}) { $Attachments->delete_attachment($path_params->{id}); } # Стандартный результат при удалении, должен быть описан в Swagger return $result; }