При вызове метода API в модуле можно передавать в его скрипт значения параметров и обрабатывать их. Например, указывать в URL метода идентификатор файла, который нужно получить, или определять дальнейшие действия в зависимости от переданного значения.
Этот способ вызова позволяет настроить интеграцию со сторонними сервисами, в которых используется сложная маршрутизация запросов с передачей параметров напрямую в URL.
Чтобы передавать значения при обращении к методу API:
- установите для него особый адрес;
- настройте обработку значений в скрипте метода.
Рассмотрим, как это сделать.
Создание метода с гибким адресом
Допустим, вы создаёте метод API для получения имени и электронной почты сотрудников. При вызове в него передаётся ID пользователя, о котором нужно запросить сведения. Если ID не передан, в ответе отправляются данные всех пользователей.
Чтобы настроить такой метод:
- В настройках пользовательского модуля на вкладке Методы API перейдите к редактированию методов.
- Нажмите + Добавить.
- В открывшемся окне введите название и выберите метод
GET
, так как при вызове будет происходить получение данных. - В поле Адрес* введите путь к методу и добавьте в конце сочетание символов /*.
- В поле Функция* задайте название функции, содержащей скрипт метода, и нажмите Сохранить.
- Сохраните метод API. Теперь часть адреса, которая будет стоять в запросе вместо символа *, не учитывается при маршрутизации. В ней можно передавать параметры.
- Перейдите на вкладку Скрипты. Определите, какие действия будут выполняться в методе в зависимости от переданного значения. Для этого получите значение из свойства
fragment
типаHttpApiRequest
, который метод API принимает при вызове:
async function users(req: HttpApiRequest): Promise<HttpResponse | void> {
const resp = new HttpResponse();
// Запись ID пользователя, полученного при вызове метода, в переменную `userId`
const userId = req.fragment;
// Если ID не пустой, выполняется поиск определённого пользователя
if (userId) {
const user = await System.users.search().where((f) => f.__id.eq(userId)).first();
// Если пользователь найден, в ответе передаются его данные
if (user) {
resp.status(HttpStatusCode.OK);
resp.json({
id: user.data.__id,
name: user.data.__name,
email: user.data.email,
});
// Если пользователь не найден, в ответе отправляется сообщение об ошибке
} else {
resp.status(HttpStatusCode.NOT_FOUND);
resp.content(`user with id ${ userId } not found`);
}
return resp;
}
// Если в запросе не передан ID, в ответ включаются данные всех пользователей
const users = await System.users.search().all();
resp.status(HttpStatusCode.OK);
resp.json(users.map((user) => ({
id: user.data.__id,
name: user.data.__name,
email: user.data.email,
})));
return resp;
}
Подробнее о написании скриптов для методов API читайте в статье «Методы API в модулях».
- Сохраните и опубликуйте метод.
Теперь вы можете вызывать настроенный метод API из сторонних систем или из скриптов ELMA365.
Вызов метода с гибким адресом из стороннего сервиса
Обращение к методам API из внешних сервисов выполняется с помощью метода fetch()
. В него передаётся полный URL метода API. Чтобы указать в запросе значения параметров, добавьте их в конце адреса через символ /.
Например, при вызове метода users/* передаётся ID пользователя для получения его данных:
let response = await fetch('https://abcd1234.elma365.ru/api/extensions/f1e6cf15-7c65-4be5-8443-021a280dcd80/script/users/fb894dcb-9fe0-4783-b7a9-8a76099446b0', {
method: "GET",
});
Вызов метода с гибким адресом из скрипта в ELMA365
Для вызова методов API через скрипт применяется метод call()
.Чтобы передать значения параметров, используйте функцию withFragment()
.
Например, при вызове метода users/* можно указать ID пользователя, чтобы запросить информацию о нём:
await Namespace.api.users
.withFragment('fb894dcb-9fe0-4783-b7a9-8a76099446b0')
.call({
method: 'GET',
});
Если передавать параметры не требуется, метод можно вызвать без функции withFragment()
. Например, при обращении к методу users/*
в этом случае вы получите сведения обо всех сотрудниках:
await Namespace.api.users.call({
method: 'GET',
});