Доступно с 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;
- Проверяйте кейс ключей хэшмапы.