Доступно с 1.20.00
В связи с переходом на полную API-фикацию функций биллинга, и избежания двойных имплементаций в системе существует интерфейс прямого вызова API, будто это происходит с отдельного приложения.
Система даёт интерфейс максимально похожим на любой другой внешний вызов, с почти полной изоляцией.
Имеет почти полную совместимость з вызовами в базу данных с search_former
Пример
use Abills::Api::Handle;
# Создаём объект работы с API
my $Api = Abills::Api::Handle->new($db, $admin, \%conf, {
html => $html,
lang => \%lang,
cookies => \%COOKIES,
# Если вы хотите получить JSON (например, для передачи в веб)
# return_type => 'json'
direct => 1
});
# GET
my $uid = 147;
my ($response, $status, $content_type) = $Api->call_api({
METHOD => "GET",
PATH => "/users/$uid",
});
# GET with query params
my $uid = 147;
my ($response, $status, $content_type) = $Api->call_api({
METHOD => "GET",
PATH => "/users/$uid",
PARAMS => \%FORM
});
# POST with body
my ($response, $status, $content_type) = $Api->call_api({
METHOD => "POST",
PATH => "/portal/newsletter",
PARAMS => \%FORM
});
Техническая часть
Функция принимает одну хэшмапу, с аргументами:
- PATH - обязательно, путь API
- METHOD - необязательно, по умолчанию GET
- PARAMS - необязательно, параметры для query params (GET) и body (POST, PUT, PATCH...)
Функция возвращает кортеж:
- ответ - данные по эндпоинту ИЛИ ошибку ({ errno, errstr })
- HTTP статус
- content_type
Миграция
Данная функция была создана для унификации вызовов системы с нашим API и его полной изоляции.
Если ваша функция на получение данных из базы и вашего API основана на search_former, миграция должна быть простой:
# Код до
my $payments_list_old = $Docs->invoices_list({
%LIST_PARAMS,
%FORM,
UNINVOICED => 1,
COLS_NAME => 1,
});
# Код после
my ($payments_list_new) = $Api->api_call({
# Можно не указывать метод если это GET
METHOD => 'GET',
PATH => '/docs/invoices/',
PARAMS => {
%LIST_PARAMS,
%FORM,
UNINVOICED => 1,
COLS_NAME => 1,
}
});
Любая функция на добавление должна мигрироваться ещё прощё:
# Код до
$Portal->portal_newsletter_add({
PORTAL_ARTICLE_ID => $last_news_id,
SEND_METHOD => $method_id,
});
# Код после
my ($newsletter_res) = $Api->api_call({
METHOD => 'POST',
PATH => '/portal/newsletter',
PARAMS => {
PORTAL_ARTICLE_ID => $last_news_id,
SEND_METHOD => $method_id,
}
});
На изменение требует некоторой модификации:
$Portal->portal_menu_change({
ID => $FORM{id},
%FORM
});
my ($res) = $Api->api_call({
METHOD => 'PUT',
# REST API предполагает использование идентификаторов прямо в path params PATH => "/portal/menus/$FORM{id}",
PARAMS => \%FORM
});
Если вы используете result_former, то его поддержка, на момент версии 1.20.00, неполная.
Вы можете спокойно им пользоваться, кроме резиновых полей.
Если вам нужны резиновые поля - рекомендуем пока этого не делать.
Пример миграции result_former БЕЗ резиновых полей:
# Код до
result_former({
INPUT_DATA => $Portal,
FUNCTION => 'attachment_list',
DEFAULT_FIELDS => 'ID,FILENAME,FILE_TYPE,FILE_SIZE,UPLOADED_AT,SRC',
SKIP_USER_TITLE => 1,
FUNCTION_FIELDS => 'del',
EXT_TITLES => {
id => 'ID',
filename => $lang{NAME},
file_type => $lang{TYPE},
file_size => $lang{SIZE},
uploaded_at => $lang{ADDED},
src => $lang{LINK}
},
TABLE => {
width => '100%',
caption => "$lang{PORTAL_ATTACHMENTS}",
qs => $pages_qs,
ID => 'PORTAL_ATTACHMENTS',
EXPORT => 1,
MENU => [ $add_button ]
},
MAKE_ROWS => 1,
TOTAL => 1
});
# Код после
my ($attachments) = $Api->api_call({
PATH => '/portal/attachment',
PARAMS => { %FORM, %LIST_PARAMS }
});
result_former({
# Список должен быть отдельным параметром хэшмапы.
DATAHASH => $attachments->{list},
# Обязательно для правильной работы пагинаций
DATATOTAL => $attachments->{total},
# Обязательно указывайте нужные вам параметры и его порядок
DEFAULT_FIELDS => 'id,filename,file_type,file_size,uploaded_at,src',
SKIP_USER_TITLE => 1,
FUNCTION_FIELDS => 'del',
EXT_TITLES => {
id => 'ID',
filename => $lang{NAME},
file_type => $lang{TYPE},
file_size => $lang{SIZE},
uploaded_at => $lang{ADDED},
src => $lang{LINK}
},
TABLE => {
width => '100%',
caption => $lang{PORTAL_ATTACHMENTS},
qs => $pages_qs,
ID => 'PORTAL_ATTACHMENTS',
EXPORT => 1,
MENU => [ $add_button ],
# Отключите резиновые поля
SHOW_COLS => 0,
},
MAKE_ROWS => 1,
TOTAL => 1,
});
Рекомендации
- Всегда проверяйте ответ на наличие ошибки, полей errno, errstr;
- Проверяйте кейс ключей хэшмапы.