Child pages
  • Программный вызов API
Skip to end of metadata
Go to start of metadata

Доступно с 1.20.00

В связи с переходом на полную API-фикацию функций биллинга, и избежания двойных имплементаций в системе существует интерфейс прямого вызова API, будто это происходит с отдельного приложения.

Система даёт интерфейс максимально похожим на любой другой внешний вызов, с почти полной изоляцией.
Имеет почти полную совместимость з вызовами в базу данных с search_former

Пример

прямые вызовы API
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,
});


Рекомендации

  1. Всегда проверяйте ответ на наличие ошибки, полей errno, errstr;
  2. Проверяйте кейс ключей хэшмапы.
  • No labels