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

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

Version 1 Next »

Доступно с 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,
  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,
  }
});

Но, имейте ввиду - поля приходят исключительно в lower_snake_case.

Любая функция на добавление должна мигрироваться ещё прощё:

# Код до
$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. Проверяйте, ли после функции не берутся значения по UPPER_SNAKE_CASE, ведь Api возвращает только lower_snake_case.
  • No labels