Методы REST API

В разделе приводится описание методов REST API для SMP.

Методы REST API

Символы "%2e", "%2E, ";", "%3b", "%3B", "%2f", "%2F", "\\", "%5c", "%5C" запрещены для передачи в URI запроса, так как использование этих символов не соответствует требованиям безопасности.

Использование accessKey суперпользователя не рекомендуется из-за соображений безопасности. У пользователя, чей accessKey будет использоваться в REST запросах, должны быть права на действия с объектом (создание, редактирование, просмотр).

Не рекомендуется отправлять пользователю в оповещении ссылку с accessKey другого сотрудника. Ссылка в оповещении либо не содержит ключ, чтобы пользователь мог сам авторизоваться в системе, особенно если настроена сквозная авторизация, либо ключ должен быть одноразовый или с коротким сроком жизни и выписанный для текущего пользователя.

add-file. Добавление файла к объекту

Адрес: "/add-file/{uuid}"

где:

  • {uuid} — идентификатор объекта, к которому будет приложен файл, например, serviceCall$1992;
  • attrCode — код атрибута типа "Файл". Если параметр указан, то файл добавляется в указанный атрибут, иначе файл добавляется к объекту.
Метод вызова: POST

Метод возвращает:

  • Сообщение об успешном выполнении операции, если файл добавлен.
  • Описание ошибки, если файл не добавлен.

Пример 1: Прикрепление файла с использованием curl к SMP. При использовании curl файл должен находиться на ПК/сервере, из которого запрос выполняется. Файл будет преобразован в массив байт и отправлен внутри REST-запроса. В примере файл находится в директории, из которой осуществляется вызов команды и имеет название index.html

curl -F "content=@index.html" http://192.168.225.145:8888/sd/services/rest/add-file/serviceCall$1992?accessKey=bccc11d3-f241-4bed-998e-1e4b3fbf3fe0

curl -F "content=@index.html" http://192.168.225.145:8888/sd/services/rest/add-file/serviceCall$1992?accessKey=bccc11d3-f241-4bed-998e-1e4b3fbf3fe0&attrCode=fileAttr

Пример 2: Прикрепление файла из одного приложения SMP к другому приложению SMP.

Copy
import java.nio.charset.Charset
import org.apache.http.client.methods.HttpPost
import org.apache.http.client.utils.URIBuilder
import org.apache.http.entity.mime.content.ByteArrayBody
import org.apache.http.impl.client.HttpClients
import org.apache.http.entity.mime.MultipartEntity
import org.apache.http.entity.ContentType
import org.apache.http.entity.mime.HttpMultipartMode
import groovy.transform.Field

@Field String ACCESS_KEY = 'ff3428b8-0469-46d3-b595-de8eb8275e5d'
@Field String HOST = 'naumen.ru'
@Field String SCHEME = 'https'

def addFile(def objectUUIDToAddFile, def file)
{
    def path = "/sd/services/rest/add-file/${objectUUIDToAddFile}";
    def uri = new URIBuilder()
        .setScheme(SCHEME)
        .setHost(HOST)
        .setPath(path)
        .setParameter('accessKey', ACCESS_KEY)
        .build()
    def content = utils.readFileContent(file);
    def utf8 = Charset.forName("UTF-8");
    def contentType = ContentType.create(ContentType.DEFAULT_BINARY.getMimeType(), utf8);
    def body = new ByteArrayBody(content, contentType, file.title);

    def entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE, null, utf8);
    entity.addPart(file.title, body);

    def post = new HttpPost(uri);
    post.setEntity(entity)

    def httpClient = HttpClients.createDefault();
    def httpResponse = httpClient.execute(post);
    httpResponse.withCloseable {response ->
        def line = response.getStatusLine()
    }
}

def file = utils.get('file$123')
def objectUUIDToAddFile = utils.get('serviceCall$123')?.UUID
return addFile(objectUUIDToAddFile, file)

check-status. Проверка доступности приложения

Адрес: "/check-status"

Метод вызова: GET

Метод возвращает:

  • Сообщение об успешном выполнении операции, если приложение доступно.
  • Описание ошибки, если приложение НЕ доступно.

Пример:

http://localhost:8888/sd/services/rest/check-status

create. Создание объекта

Адрес: "/create/{fqn}" или "/create/{fqn}/{attributes}"

где:

  • {fqn} — fqn создаваемого объекта, например, serviceCall;
  • {attributes} — атрибуты создаваемого объекта.

Форматы передачи атрибутов и их значений описаны в разделе.

Метод также можно использовать для добавления комментария к объекту (аналогично utils.create), при этом:

  • {fqn} — comment;
  • {attributes} — атрибуты создаваемого объекта:
    • source — объект или его идентификатор, к которому необходимо добавить комментарий;

    • text — текст комментария

Методы вызова: POST, GET.

Рекомендуется использовать POST во избежание проблем с лимитами на стороне веб-сервера

Метод возвращает:

  • Сообщение об успешном выполнении операции, если объект создан. Информация про uuid объекта отсутствует.
  • Описание ошибки, если объект не создан.

create-excl. Создание исключения в указанном классе обслуживания

Адрес: "/create-excl/{uuid}/{attributes}"

где:

  • {uuid} — uuid класса обслуживания, в который нужно добавить исключение, например, servicetime$2204
  • {attributes} — атрибуты создаваемого объекта,
Метод вызова: GET

Метод возвращает:

  • Созданный объект в формате JSON. Черновик редактируемого класса обслуживания, в котором создается исключение, будет автоматически подтвержден.
  • Описание ошибки, если объект не создан.

Пример. Переход по ссылке:

http://192.168.112.46:8080/sd/services/rest/create-excl/servicetime$2204/{"endTime":54000000,"startTime":28800000,"exclusionDate":"2010-10-04"}?accessKey=470f7276-c183-4d19-bc6f-8b769dbf42fe&

Полученный результат:

{"UUID":"srvTimeExcl$10502","endTime":54000000,"startTime":28800000,"exclusionDate":"2010-10-04"}

create-m2m. Создание объекта для машинного взаимодействия

Адрес: "/create-m2m/{fqn}/{attributes}"

где:

  • {fqn} — fqn создаваемого объекта, например, serviceCall;
  • {attributes} — атрибуты создаваемого объекта.

Форматы передачи атрибутов и их значений описаны в разделе.

Параметры метода:

  • accessKey — ключ доступа для пользователя;
  • attrs — коды атрибутов (через запятую, без пробелов), которые необходимо вернуть в ответе. Если параметр будет пустой, то вернется весь объект.
Метод вызова: POST

Метод возвращает:

  • Созданный объект в формате JSON;
  • Только указанные атрибуты, если установлен attrs;
  • Причину, по которой объект не был создан.

Возможные ответы сервера, если объект не был создан:

  • Неправильный ключ авторизации: Код возврата 500 Internal Server Error. Переход не может быть выполнен: ключ авторизации [0f3f32de-3a1c-41aa-8510-ad2a025397a8] не найден или не может быть использован повторно.
  • Ключ авторизации не позволяет добавлять, просматривать или искать нужный объект (у пользователя, для которого создали ключ, нет прав на объект): Код возврата 401 Unauthorized. Ошибка авторизации. У Вас нет прав на Добавление объекта в классе "Запрос" (serviceCall).
  • Ключ просрочен: Код возврата 500 Internal Server Error: Переход не может быть выполнен: Время жизни ключа авторизации [f9ec8786-6f29-4c73-abc9-a2548f09247d] истекло.
  • Параметры для создания объекта закодированы неправильно: Код возврата 500: String length must be a multiple of four. или com.google.gson.stream.MalformedJsonException: Unterminated string at line 1 column 64 или Not a JSON Object.
  • Не указан один из атрибутов, обязательный для создания объекта: Код возврата 500: Запрос '25' не может быть переведен в статус 'Новая'. Произошла ошибка при выполнении скрипта входа. Заявка '25' не может быть изменена по следующим причинам: Не заполнены следующие обязательные атрибуты: Описание.
  • Указаны "лишние" атрибуты для создания объекта. Код возврата 500: Атрибут не найден: issue:olala.

Примеры:

  1. Запрос создает отдел типа ou$ACHou с title='мы создали отдел по описанию' и возвращает весь объект в формате JSON.

    http://sd40.naumen.ru/sd/services/rest/create-m2m/ou$ACHou/{title:'мы создали отдел по описанию'}

  2. Запрос создает отдел типа ou$ACHou с title='отдел по сказкам' и возвращает UUID и title созданного объекта (attrs=UUID,title).

    http://sd40.naumen.ru/sd/services/rest/create-m2m/ou$ACHou/{title:'отдел по сказкам'}?attrs=UUID,title

  3. Запрос повторяет запрос из примера 2, только в данном запросе дополнительно указан accessKey.

    http://sd40.naumen.ru/sd/services/rest/create-m2m/ou$ACHou/{title:'отдел по сказкам'}?attrs=UUID,title&accessKey=aed74f94-22cf-4e9f-8834-9732a0a1d847

createMultiple. Создание множества объектов для машинного взаимодействия

Адрес: "/create-m2m-multiple/[{attributes}, ..., {attributes}]"

где:

  • {attributes} — атрибуты создаваемого объекта.

Параметр метода:

  • accessKey — ключ доступа для пользователя.
Метод вызова: POST/GET

Метод возвращает:

  • Массив объектов в формате JSON с UUID для созданных и переданную информацию для создания объекта с сообщением об ошибке для не созданных.

Примеры:

  1. Запрос создает отделы типа ou$ACHou с указанным title, возвращает массив объектов с UUID созданных объектов: [{"UUID": "ou$46301"},{"UUID": "ou$46302"}] .

    http://sd40.naumen.ru/sd/services/rest/create-m2m-multiple/[{"metaClass":"ou$ACHou","title":"Отдел 1"},{"metaClass":"ou$ACHou","title":"Отдел 2"}]?accessKey=3b9e7619-857e-40fa-926f-ddbc40899598

  2. Запрос создает отдел типа ou$ACHou с указанным title "Отдел 1", возвращает массив объектов с UUID для созданных объектов и переданную информацию для создания объекта с сообщением об ошибке для не созданных: [{"UUID":"ou$46303"},{"metaClass":"ou$ACHouErr","title":"Отдел 2","error":"Метакласс не найден: fqn=ou$ACHouErr"}].

    http://sd40.naumen.ru/sd/services/rest/create-m2m-multiple/[{"metaClass":"ou$ACHou","title":"Отдел 1"},{"metaClass":"ou$ACHouErr","title":"Отдел 2"}]?accessKey=3b9e7619-857e-40fa-926f-ddbc40899598

Ответы сервера:

  • Неправильный ключ авторизации: Код возврата 500 Internal Server Error. Переход не может быть выполнен: ключ авторизации [0f3f32de-3a1c-41aa-8510-ad2a025397a8] не найден или не может быть использован повторно.
  • Ключ просрочен: Код возврата 500 Internal Server Error: Переход не может быть выполнен: Время жизни ключа авторизации [f9ec8786-6f29-4c73-abc9-a2548f09247d] истекло.
  • Если среди набора объектов успешно создались все объекты: код возврата 201 Created.
  • Если среди набора объектов ни один объект ни создался: код возврата 500 Internal Server Error.
  • Если среди набора объектов часть объектов успешно создалась, а часть не создалась: код возврата 207 MULTI-STATUS.

delete. Удаление объекта

Адрес: "/delete/{uuid}"

где:

  • {uuid} — uuid удаляемого объекта, например, serviceCall$501.

Метод возвращает:

  • Сообщение об успешном выполнении операции, если объект удален.
  • Описание ошибки, если объект не удален.

edit. Редактирование объекта

Адрес: "/edit/{uuid}" или "/edit/{uuid}/{attributes}"

где:

  • {uuid} — uuid изменяемого объекта, например, serviceCall$501;
  • {attributes} — изменяемые атрибуты.

Форматы передачи атрибутов и их значений описаны в разделе.

Если при редактировании объекта (например, при смене статуса) обязательно добавление комментария, то среди изменяемых атрибутов {attributes} необходимо указать параметр @comment и в качестве его значения передать текст комментария (аналогично utils.edit).

Не рекомендуется использовать метод только для добавления комментария, т.к. он вызывает выполнение действия по событию на изменение объекта. Корректным способом добавления комментария является метод create.

Метод вызова: POST, GET.

Рекомендуется использовать POST во избежание проблем с лимитами на стороне веб-сервера

Метод возвращает:

  • Сообщение об успешном выполнении операции, если редактирование выполнено.
  • Описание ошибки, если редактирование не выполнено.

edit-excl. Редактирование периода исключения для заданного исключения класса обслуживания

Адрес: "/edit-excl/{uuid}/{attributes}"

где:

  • {uuid} — uuid изменяемого объекта, например, srvTimeExcl$10502;
  • {attributes} — изменяемые атрибуты.

Метод возвращает:

  • Измененный объект в формате JSON. Черновик редактируемого класса обслуживания, в котором создается исключение, будет автоматически подтвержден.
  • Описание ошибки, если редактирование не выполнено.

Пример: Переход по ссылке:

http://192.168.112.46:8080/sd/services/rest/edit-excl/srvTimeExcl$10502/{"endTime":54000000,"startTime":28800000}?accessKey=470f7276-c183-4d19-bc6f-8b769dbf42fe&

Полученный результат:

{"UUID":"srvTimeExcl$10502","endTime":54000000,"startTime":28800000,"exclusionDate":"2010-10-04"}

edit-m2m. Редактирование (для машинного взаимодействия)

Адрес: "/edit-m2m/{uuid}/{attributes}"

где:

  • {uuid} — uuid изменяемого объекта, например, srvTimeExcl$10502;
  • {attributes} — изменяемые атрибуты.

Форматы передачи атрибутов и их значений описаны в разделе.

Метод вызова: POST

Параметры метода:

  • accessKey — ключ доступа для пользователя;
  • attrs — коды атрибутов (через запятую, без пробелов), которые необходимо вернуть в ответе. Если параметр будет пустой, то вернется весь объект.

Метод возвращает:

  • Измененный объект в формате JSON.
  • Только указанные атрибуты, если установлен attrs.
  • Описание ошибки, если редактирование не выполнено.

Примеры:

  1. Запрос изменяет отдел с UUID=ou$6701, устанавливает title="новое название" и возвращает весь объект в формате JSON.

    http://sd40.naumen.ru/sd/services/rest/edit-m2m/ou$6701/{'title':'новое название'}

  2. Запрос повторяет запрос из примера 1, но в результате метод возвращает только атрибуты title, UUID данного объекта.

    http://sd40.naumen.ru/sd/services/rest/edit-m2m/ou$6701/{'title':'новое название'}?attrs=UUID,title

  3. Запрос повторяет запрос из примера 2, отличается тем, что указывается accessKey.

    http://sd40.naumen.ru/sd/services/rest/edit-m2m/ou$6701/{'title':'новое название'}?accessKey=aed74f94-22cf-4e9f-8834-9732a0a1d847&attrs=UUID,title

get. Получение информации об объекте

Адрес: "/get/{uuid}"

где:

  • uuid — uuid интересующего объекта.

Параметры метода:

  • accessKey — ключ доступа для пользователя;
  • attrs — коды атрибутов (через запятую, без пробелов), которые необходимо вернуть в ответе. Если параметр будет пустой, то вернется весь объект.
Метод вызова: GET

Примеры:

  1. Запрос возвращает атрибуты title, UUID, employees у объекта с UUID = ou$6701.

    http://sd40.naumen.ru/sd/services/rest/get/ou$6701?attrs=title,UUID,employees

  2. Запрос повторяет запрос из примера 2, отличается тем, что указывается accessKey.

    http://sd40.naumen.ru/sd/services/rest/get/ou$6701?accessKey=cad4bb57-3f1c-4b13-96de-f2f923928f63&attrs=title,UUID,employees

Использование GET запросов с фигурными скобками и точками с запятыми не соответствует требованиям безопасности. Необходимо отказаться от таких HTTP GET запросов, поменяв их на POST запросы.

get-file. Получение контента файла по его UUID

Адрес: "/get-file/{uuid}"

где:

  • uuid — uuid файла.
Метод вызова: GET

Пример:

http://localhost:8888/sd/services/rest/get-file/file$123?accessKey=e2469fa1-123c-492d-ada3-42f8be19afa8

find. Поиск

Метод find нельзя использовать для поиска файлов. Для скачивания файлов можно воспользоваться методом get-file-by-func, для получения информации о файлах — методом exec.

Адрес: "/find/{fqn}" или "/find/{fqn}/{attributes}"

где:

  • {fqn} — fqn типа (класса) объекта;
  • {attributes} — атрибуты и их значения, по которым осуществляется поиск.

Форматы передачи атрибутов и их значений описаны в разделе.

Методы вызова: POST, GET.

Рекомендуется использовать POST во избежание проблем с лимитами на стороне веб-сервера

Параметры метода:

  • accessKey — ключ доступа для пользователя;
  • inAttr — название атрибута, в котором будет возвращен список найденных значений;
  • offset — количество строк (число), которые будут пропускаться перед выводом результатов запроса;
  • limit — максимальное количество элементов для поиска (число);
  • attrs — коды атрибутов, которые необходимо вернуть в ответе (через запятую, без пробелов). Если параметр будет пустой, то вернется весь объект.

Метод возвращает:

  • Если inAttr не указан, то возвращается список найденных объектов в формате JSON.
  • Если inAttr указан, то вернется один JSON объект, с атрибутом, название которого передано в параметре inAttr. В атрибуте будет список найденных объектов в формате JSON.

У найденных объектов отображаются только те атрибуты, на просмотр которых есть права у пользователя, указанного в accessKey.

Лимит числа возвращаемых объектов настраивается в конфигурационном файле dbaccess.properties.

Примеры ссылок для поиска по различным параметрам:

  1. http://192.168.225.145:8888/services/rest/find/team/{%22metaClass%22:%22ATTeamCase%22}?accessKey=e00c8761-b105-4c2b-a86c-f7fe20cff9b3&inAttr=response
  2. http://192.168.240.92:10080/sd/services/rest/find/ou/{%22title%22:%22Бухгалтерия%22}?accessKey=9e15ba5d-6463-4d24-91c5-bb0892b2166e
  3. http://192.168.240.92:10080/sd/services/rest/find/ou/{title:Бухгалтерия}?accessKey=9e15ba5d-6463-4d24-91c5-bb0892b2166e
  4. http://192.168.240.92:10080/sd/services/rest/find/ou/{title:IT}?accessKey=9e15ba5d-6463-4d24-91c5-bb0892b2166e
  5. http://192.168.240.92:10080/sd/services/rest/find/ou/%7Btitle:%D0%91%D1%83%D1%85%D0%B3%D0%B0%D0%BB%D1%82%D0%B5%D1%80%D0%B8%D1%8F%7D?accessKey=9e15ba5d-6463-4d24-91c5-bb0892b2166e
  6. http://192.168.240.92:10080/sd/services/rest/find/ou/{%22title%22:%22IT%22}?accessKey=290c008f-a070-4bd6-b3f6-ad3ca567a9c6
  7. http://192.168.240.92:10080/sd/services/rest/find/ou/{'title':'IT'}?accessKey=290c008f-a070-4bd6-b3f6-ad3ca567a9c6
  8. http://192.168.240.92:10080/sd/services/rest/find/ou/?accessKey=290c008f-a070-4bd6-b3f6-ad3ca567a9c6&title=IT
  9. http://192.168.240.92:10080/sd/services/rest/find/ou/%7Btitle:%D0%91%D1%83%D1%85%D0%B3%D0%B0%D0%BB%D1%82%D0%B5%D1%80%D0%B8%D1%8F%7D\?accessKey\=9e15ba5d-6463-4d24-91c5-bb0892b2166e

Примеры ссылок, сгенерированных с помощью утилит api.rest:

  1. http://192.168.240.92:10080sd/services/rest/find/employee/40xe30=?offset=3&limit=10&attrs=title,UUID
  2. http://192.168.240.92:10080/sd/services/rest/find/ou$geneal/40xeyJ0aXRsZSI6ItCe0YLQtNC10Lsg0YLQtdGB0YLQuNGA0L7QstCw0L3QuNGPIn0=?accessKey=9a9d0e8c-bb98-4d04-a2a1-9d193256d55c&offset=3&limit=10&attrs=title,UUID

Пример рукописных ссылок (соблюдать последовательность параметров offset, limit, attrs, accessKey, после запроса (то, что после ?) не обязательно, главное они должны разделяться символом &):

  1. Запрос выполняет поиск отделов типа ou$ACHou, у которых атрибуты title=ouTitle, removed=false. Среди найденных отделов пропускается 1 (offset=1) и берутся следующие 5 (если будет меньше 5, например 3, то берем только 3).

    Запрос возвращает только атрибуты title и UUID (attrs=title,UUID).

    http://sd40.naumen.ru/sd/services/rest/find/ou$ACHou/{title:ouTitle,removed:false}?offset=1&limit=5&attrs=title,UUID&accessKey=4477044b-8d5a-4f2d-9d16-0da489882e68

  2. Запрос повторяет запрос из примера 1, только не указывается accessKey и не учитывается тип отдела.

    http://sd40.naumen.ru/sd/services/rest/find/ou/{title:ouTitle,removed:false}?offset=1&limit=5&attrs=title,UUID

  3. Запрос производит поиск отделов типа ou$ACHou, у которых атрибуты title=ouTitle. Среди найденных отделов берутся первые 5 (limit=5).

    Запрос возвращает только атрибуты title и UUID (attrs=title,UUID).

    http://sd40.naumen.ru/sd/services/rest/find/ou$ACHou/{title:ouTitle}?limit=5&attrs=title,UUID

  4. Запрос производит поиск без параметров и указания типа, и возвращает все title и UUID всех возможных отделов.

    http://sd40.naumen.ru/sd/services/rest/find/ou/{}?attrs=title,UUID

search. Быстрый поиск

Адрес: "/search"
Метод вызова: GET

Параметры метода:

  • term — поисковый запрос;
  • mode — тип поиска: не-архивные (active), архивные (removed), все(all);
  • limit — максимальное число найденных объектов;
  • accessKey — ключ доступа.

Описание: Чтобы метод работал, необходимо настроить быстрый поиск по используемым в методе атрибутам, см. Настройка поиска по атрибутам объектов определенного класса/типа и проиндексировать, см. Переиндексация.

Примеры:

http://192.168.240.92:10080/sd/services/rest/search?term=Asura&accessKey=9baec4d6-ad92-4645-b032-3e671772804c

http://192.168.240.92:10080/sd/services/rest/search?term=Asura&mode=active&accessKey=9baec4d6-ad92-4645-b032-3e671772804c

http://192.168.240.92:10080/sd/services/rest/search?term=Asura&mode=active&limit=20&accessKey=9baec4d6-ad92-4645-b032-3e671772804c

http://192.168.240.92:10080/sd/services/rest/search?term=Service%20call&mode=active&limit=20

http://192.168.240.92:10080/sd/services/rest/search?term=%D0%91%D1%83%D1%85%D0%B3%D0%B0%D0%BB%D1%82%D0%B5%D1%80%D0%B8%D1%8F&accessKey=9baec4d6-ad92-4645-b032-3e671772804c

search. Расширенный поиск

Адрес: "/search/{fqn}/{attributes}"

где:

  • {fqn} — fqn типа (класса) объекта;
  • {attributes} — атрибуты и их значения для осуществления поиска.
Метод вызова: GET

Параметры метода:

  • mode — тип поиска: не-архивные (active), архивные (removed), все(all);
  • limit — максимальное число найденных объектов;
  • accessKey — ключ доступа.

Описание: Чтобы метод работал, необходимо настроить расширенный поиск по используемым в методе атрибутам, см. Настройка поиска по атрибутам объектов определенного класса/типа и проиндексировать, см. Переиндексация.

Пример:

http://192.168.240.92:10080/sd/services/rest/search/music$Artists/{%22title%22:%22Asura%22}?accessKey=9baec4d6-ad92-4645-b032-3e671772804c

http://192.168.240.92:10080/sd/services/rest/search/serviceCall$Task/{%22title%22:%22%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0%22}?accessKey=9baec4d6-ad92-4645-b032-3e671772804c

http://192.168.240.92:10080/sd/services/rest/search/serviceCall$Task/%7B%22title%22%3A%22Task%22%2C%22description%22%3A%22This%20task%20is%22%7D?accessKey=9baec4d6-ad92-4645-b032-3e671772804c

http://192.168.240.92:10080/sd/services/rest/search/serviceCall$Task/{%22title%22:%22%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0%22}?mode=removed

http://192.168.240.92:10080/sd/services/rest/search/serviceCall$Task/{%22title%22:%22%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0%22}?limit=20

Методы REST API, вызываемые через модуль

Скрипт оформляется в модуль, скриптовый модуль загружается в систему.

exec-post. Выполнение скрипта через POST запрос

Адрес: "/exec-post"

Параметры метода:

  • accessKey — ключ авторизации;
  • func (обязательный) — название модуля и функции, вызываемой из модуля (func=modules.moduleCode.methodName):

    • moduleCode — код вашего модуля;
    • methodName — вызываемый метод (функция).
  • params (обязательный) — параметры метода (функции): &params=param1,param2 либо &params= , если параметров нет.

  • raw=true — признак, что обработки данных request не будет, в результате в функции будет доступен "сырой" request.

Метод вызова: POST

Пример. Вызов метода "someMethod" модуля "restModule" с параметрами "Какой-то текст", 10 и "Some data", и ключом доступа:

http://localhost:8888/sd/services/rest/exec-post?accessKey=db1ba6f4-c440-437d-b4ce-e965cf4516d7&func=modules.restModule.someMethod&params=%22%D0%9A%D0%B0%D0%BA%D0%BE%D0%B9-%D1%82%D0%BE%20%D1%82%D0%B5%D0%BA%D1%81%D1%82%22,10,%22Some%20data%22

Общие особенности метода

  • При выполнении скрипта проверка прав не производится. Проверка прав при выполнении метода включается в конфигурационном файле системы dbaccess.properties (REST API). По умолчанию проверка отключена.
  • В вызываемом методе скриптового модуля будет присутствовать контекстная переменная user, которая аналогична объекту user, полученному через params.

    Эта же переменная user попадет в скрипты, которые инициируются после выполнения указанного метода (функции).

    Пример: methodName создает объект → выполняется действие по событию "добавление объекта" → в скрипте этого действия по событию используется контекстная переменная user (исходный сотрудник).

  • Параметры можно указывать не только в теле запроса, но и в params, например:
Copy
http://localhost:8080/sd/services/rest/exec-post?accessKey=b8f7a2e3-e8b9-41bd-97ec-d0a91158792b&func=modules.someModule.test&params=requestContent,'123','hello',user 

def test(def requestContent, def number, def text, def user)
{
...
}

Допустимые символы для передачи в параметрах метода (params)

До версии 4.15.5 есть ограничение на символы, допустимые для использования в параметре params. Они определяются регулярным выражением:

[а-яА-ЯееA-Za-z0-9,\[\]$'\"_\s\*\-%@&\\]*

Чтобы отправить символы, не являющиеся допустимыми, в рамках определенного выше регулярного выражения, необходимо выразить их через допустимые одним из способов:

  • Преобразовать значение в кодировку Base64 URL перед отправкой запроса и декодировать его обратно в методе модуля (предпочтительный способ).

    Форматом Base64 URL признается кодирование URL-адресов, при котором символы + и / заменяются, соответственно, на - и _ (см. документацию).

  • Преобразовать параметры адресной строки в кодировку URL с последующей декодировкой параметра в методе модуля.

    Для кодирования строки в формат URL можно использовать метод URLEncoder.encode(), для декодирования — метод URLDecoder.decode().

    Форматом URL признается стандартное кодирование строки запроса в URL-запросах (см. документацию).

С версии 4.15.5 нет ограничения на использование символов в параметре params.

С версии 4.15.5 не рекомендуется передача массивов и объектов (а также других конструкций, для передачи которых необходимо использование запятой внутри самой конструкции). Если необходима передача подобных значений, то следует оборачивать весь параметр в кавычки. В таком случае в скрипт параметр будет передан в виде строки.

http://localhost:8888/services/rest/exec-post?accessKey=4be017dc-fba6-4ada-b00a-9a3f3dc0e10afunc=modules.restModule.someMethod&params="[1,'abc',2]",2,3,"[1,['ab','bc']]"

Передача данных в формате form-data (метод поддерживает получение данных в формате form-data).

Пример скрипта, который прикрепляет файлы к объектам, используя указанное описание

Copy
import groovy.json.JsonOutput;

public def doAction(def request)
{  
  def serviceCall = utils.get('serviceCall$2359703')   
  def uuids = request.fileNames
      .collectMany { fileName -> request.getFiles(fileName) }
      .collect { file ->
          def fileName = file?.originalFilename ?: ''
          def contentType = file.contentType
          def description = request.getParameter('description')
          def bytes = file.getBytes()
          return utils.attachFile(serviceCall, fileName, contentType, description, bytes).UUID
      }
  
  return JsonOutput.toJson(uuids)
}

Получение дополнительной информации о запросе в параметрах метода (params)

  • user — получение объекта сотрудника.

    В запросе необходимо передать user в параметрах:

    http://localhost:8080/sd/services/rest/exec-post?accessKey=b8f7a2e3-e8b9-41bd-97ec-d0a91158792b&func=modules.restModule.someMethod&params=user

    В сигнатуре метода следует указать аргумент user:

    Copy
    def someMethod(def user)
    {
    ...
    }

    В аргументе user будет лежать облегченный объект класса "Сотрудник" (employee) или null, в зависимости от того, как был вызван метод:

    • Если в запросе был указан ключ авторизации сотрудника, то в аргументе user будет лежать его облеченный объект.
    • Если в запросе был указан ключ авторизации суперпользователя, то в аргументе user будет лежать null.
    • Если ключ авторизации указан не был и запрос выполняется из интерфейса оператора (или МК), то в переменной user будет лежать облеченный объект (для сотрудника) или null (для суперпользователя).

    Облегченный - означает, что у этого объекта нельзя напрямую получить значения атрибутов некоторых типов: ссылка на БО, набор ссылок на БО, элемент справочника, набор элементов справочника. При попытке их получения, будет падать ошибка “could not initialize proxy - no Session”. Для их получения, необходимо повторно поднять объект:

    user = utils.get(user.UUID)

    Наличие или отсутствие user в params никак не связано с переменной user.

  • request — получение объекта запроса.

    В запросе необходимо передать request в параметрах:

    http://localhost:8080/sd/services/rest/exec-post?accessKey=b8f7a2e3-e8b9-41bd-97ec-d0a91158792b&func=modules.restModule.someMethod&params=request

    В сигнатуре метода следует указать аргумент request:

    Copy
    def someMethod(def request)
    {
    ...
    }

    Объект request будет содержать тело запроса в виде объекта типа javax.servlet.http.HttpServletRequest, который позволяет получить различные данные из запроса, например заголовки, файлы и т.п.

  • response — получение объекта ответа:

    В запросе необходимо передать response в параметрах:

    http://localhost:8080/sd/services/rest/exec-post?accessKey=b8f7a2e3-e8b9-41bd-97ec-d0a91158792b&func=modules.someModule.test&params=request

    В сигнатуре метода следует указать аргумент response: def test (def request, def response) { ... } </pre>

    Объект request будет содержать ответ на запрос в виде объекта типа javax.servlet.http.HttpServletResponse , который позволяет выполнить редирект или проставить заголовки.

  • requestContent - JSON-тело запроса:

    В запросе необходимо передать requestContent:

    http://localhost:8080/sd/services/rest/exec-post?accessKey=b8f7a2e3-e8b9-41bd-97ec-d0a91158792b&func=modules.someModule.test&params=requestContent,user

    Само тело запроса (body) обязательно должно передаваться в формате JSON.

    В сигнатуре метода следует указать аргумент requestContent:

    Copy
    def test (def requestContent, def user)
    {
    ...
    }

Подробнее о параметре raw

  • чтобы работать с телом запроса как с сырым request, нужно передать параметр request и указать raw=true, в теле функции будет доступен сырой request, в requestContent будет пусто.

    http://localhost:8080/sd/services/rest/exec-post?accessKey=18d59681-3559-48f5-8167-bca783364912&func=modules.Scripts.processRequestResponse&params=request,response&raw=true

  • чтобы работать с телом запроса в виде xml, нужно передать параметр request и указать raw=true, в теле функции будет доступен сырой request, который можно самостоятельно распарсить из xml, в requestContent будет пусто.
  • запрос с указанием параметров requestContent и request и raw=true не имеет смысла, т.к. при указании raw=true любая обработка request исключается, в requestContent будет пусто.

Подробнее о параметре response

Возвращаемый тип ответа

У response можно установить ContentType с помощью метода setContentType(String contentType), где строка contentType может принимать одно из общепринятых значений MIME-типов. В итоге результат выполнения API-метода будет с проставленным content-type.

Пример модуля

Copy
http://localhost:8080/sd/services/rest/exec-post?accessKey=41cf3619-aa04-4b68-ba5b-08dacdec3669&func=modules.someModule.test&params=request,response

def getHtml(def request, def response)
{
  response.setContentType('text/html; charset=UTF-8')
  return '<HTML><HEAD><TITLE>Test</TITLE></HEAD></HTML>'
}

Результат выполнение такого модуля будет с content-type: text/html;charset=UTF-8

Copy
Headers:
cache-control → no-cache, no-store, max-age=0, must-revalidate
connection → keep-alive
content-type → text/html;charset=UTF-8
...
responseurl → /sd/services/rest/exec-post?accessKey=41cf3619-aa04-4b68-ba5b-08dacdec3669&func=modules.test.getHtml&params=request,response

Body:
<HTML>
    <HEAD>
        <TITLE>Test</TITLE>
    </HEAD>
</HTML>

Этот же модуль без setContentType

Copy
http://localhost:8080/sd/services/rest/exec-post?accessKey=41cf3619-aa04-4b68-ba5b-08dacdec3669&func=modules.someModule.test&params=request,response

def getHtml(def request, def response)
{
  return '<HTML><HEAD><TITLE>Test</TITLE></HEAD></HTML>'
}

Результат выполнение такого модуля будет с content-type: application/json;charset=UTF-8

Copy
Headers:
cache-control → no-cache, no-store, max-age=0, must-revalidate
connection → keep-alive
content-type → application/json;charset=UTF-8
...
responseurl → /sd/services/rest/exec-post?accessKey=41cf3619-aa04-4b68-ba5b-08dacdec3669&func=modules.test.getHtml&params=request,response

Body:
Unexpected '<'

Доступные методы в response

  • addDateHeader(java.lang.String name, long date)

    Описание: Добавляет заголовок ответа с указанным именем и датой-значением

    Параметры:

    • name — java.lang.String — название заголовка, добавляемого в request;
    • date — long — дата и время в формате количества миллисекунд с 01 января 1970 года.

    Возвращаемое значение: void

    Пример использования:

    Copy
    http://localhost:8080/sd/services/rest/exec-post?accessKey=41cf3619-aa04-4b68-ba5b-08dacdec3669&func=modules.someModule.getHtml&params=request,response

    def getHtml(def request, def response)
    {
      response.addDateHeader('dateHeader', 1636353934218L)
      return '<HTML><HEAD><TITLE>Test</TITLE></HEAD></HTML>'
    }
  • addHeader(java.lang.String name, java.lang.String value)

    Описание: Добавляет заголовок ответа с указанным именем и значением

    Параметры:

    • name — java.lang.String — название заголовка, добавляемого в request
    • value — java.lang.String — добавляемое значение заголовка.

      Если содержит бинарные данные в формате 16-ричных значений ("FFAA" = 0xFFAA, "1C28" = 0x1C28), то оно должно быть закодировано в соответствии с RFC 2047 (http://www.ietf.org/rfc/rfc2047.txt)

    Возвращаемое значение: void.

    Пример использования:

    Copy
    http://localhost:8080/sd/services/rest/exec-post?accessKey=41cf3619-aa04-4b68-ba5b-08dacdec3669&func=modules.someModule.getHtml&params=request,response

    def getHtml(def request, def response)
    {
      response.addHeader('header', "value")
      return '<HTML><HEAD><TITLE>Test</TITLE></HEAD></HTML>'
    }
  • addIntHeader(java.lang.String name, int value)

    Описание: Добавляет заголовок ответа с указанным именем и целочисленным значением

    Параметры:

    • name — java.lang.String — название заголовка, добавляемого в request
    • value — int — добавляемое целочисленное значение заголовка

    Возвращаемое значение: void.

    Пример использования:

    Copy
    http://localhost:8080/sd/services/rest/exec-post?accessKey=41cf3619-aa04-4b68-ba5b-08dacdec3669&func=modules.someModule.getHtml&params=request,response

    def getHtml(def request, def response)
    {
      response.addIntHeader('header', 123)
      return '<HTML><HEAD><TITLE>Test</TITLE></HEAD></HTML>'
    }
  • containsHeader(java.lang.String name)

    Описание: Возвращает логическое значение, указывающее, был ли заданный заголовок ответа уже установлен

    Параметр:

    • name — java.lang.String — название искомого заголовка в request.

    Возвращаемое значение: true, если заголовок с таким названием содержится в response, иначе false.

    Пример использования:

    Copy
    http://localhost:8080/sd/services/rest/exec-post?accessKey=41cf3619-aa04-4b68-ba5b-08dacdec3669&func=modules.someModule.getHtml&params=request,response

    def getHtml(def request, def response)
    {
      def hasHeader = response.containsHeader('header')
      return hasHeader ? '<HTML><HEAD><TITLE>Test1</TITLE></HEAD></HTML>' : '<HTML><HEAD><TITLE>Test2</TITLE></HEAD></HTML>'
    }
  • getHeader(java.lang.String name)

    Описание: Получает значение заголовка ответа с заданным именем.

    Параметр:

    • name — java.lang.String — название заголовка в request

    Возвращаемое значение: java.lang.String — значение заголовка с переданным названием или null, если такого заголовка нет в response

    Пример использования:

    Copy
    http://localhost:8080/sd/services/rest/exec-post?accessKey=41cf3619-aa04-4b68-ba5b-08dacdec3669&func=modules.someModule.getHtml&params=request,response

    def getHtml(def request, def response)
    {
      def headerValue = response.getHeader('header')
      return "<HTML><HEAD><TITLE>Test ${headerValue}</TITLE></HEAD></HTML>"
    }
  • getHeaderNames()

    Описание: Получает имена заголовков этого ответа.

    Возвращаемое значение: java.util.Collection<java.lang.String> — коллекция (возможно пустая) названий заголовков, содержащихся в response

    Пример использования:

    Copy
    http://localhost:8080/sd/services/rest/exec-post?accessKey=41cf3619-aa04-4b68-ba5b-08dacdec3669&func=modules.someModule.getHtml&params=request,response

    def getHtml(def request, def response)
    {
      def headers = response.getHeaderNames()
      return "<HTML><HEAD><TITLE>Test ${headers}</TITLE></HEAD></HTML>"
    }
  • getHeaders(java.lang.String name)

    Описание: Получает значения заголовка ответа с заданным именем.

    Параметр:

    • name — java.lang.String — название заголовка в request

    Возвращаемое значение: java.util.Collection<java.lang.String> — коллекция (возможно пустая) значений заголовков, с переданным именем

    Пример использования:

    Copy
    http://localhost:8080/sd/services/rest/exec-post?accessKey=41cf3619-aa04-4b68-ba5b-08dacdec3669&func=modules.someModule.getHtml&params=request,response

    def getHtml(def request, def response)
    {
      def headers = response.getHeaders('header')
      return "<HTML><HEAD><TITLE>Test ${headers}</TITLE></HEAD></HTML>"
    }
  • getStatus()

    Описание: Получает текущий код состояния этого ответа

    Возвращаемое значение: int — текущий код статуса response

    Пример использования:

    Copy
    http://localhost:8080/sd/services/rest/exec-post?accessKey=41cf3619-aa04-4b68-ba5b-08dacdec3669&func=modules.someModule.getHtml&params=request,response

    def getHtml(def request, def response)
    {
      def status = response.getStatus()
      return "<HTML><HEAD><TITLE>Test ${status}</TITLE></HEAD></HTML>"
    }
  • sendError(int sc)

    Описание: Отправляет клиенту ответ об ошибке, используя указанный код состояния, и очищает буфер

    Параметр:

    • sc — int — код статуса отправляемой ошибке в формате 2XX, 3XX, 4XX или 5XX.

    Возвращаемое значение: void

    Особенности работы метода:

    throws: IOException – если произошла ошибка ввода/вывода

    IllegalStateException – если response был отправлен (commited в документации HttpServletResponse) до того, как вызван этот метод

    Пример использования:

    Copy
    http://localhost:8080/sd/services/rest/exec-post?accessKey=41cf3619-aa04-4b68-ba5b-08dacdec3669&func=modules.someModule.getHtml&params=request,response

    def getHtml(def request, def response)
    {
      response.sendError(404)
    }
  • sendError(int sc, java.lang.String msg)

    Описание: Отправляет клиенту ответ об ошибке, используя указанный статус, и очищает буфер.

    Параметры:

    • sc — int — код статуса отправляемой ошибке в формате 2XX, 3XX, 4XX или 5XX;
    • msg — java.lang.String — описание ошибки.

    Возвращаемое значение: void.

    Особенности работы метода:

    throws: IOException – если произошла ошибка ввода/вывода

    IllegalStateException – если response был отправлен (commited в документации HttpServletResponse) до того, как вызван этот метод

    Пример использования:

    Copy
    http://localhost:8080/sd/services/rest/exec-post?accessKey=41cf3619-aa04-4b68-ba5b-08dacdec3669&func=modules.someModule.getHtml&params=request,response

    def getHtml(def request, def response)
    {
      response.sendError(404, 'Not found page')
    }
  • sendRedirect(java.lang.String location)

    Описание: Отправляет временный ответ перенаправления клиенту, используя указанный URL-адрес местоположения перенаправления, и очищает буфер

    Параметр:

    • location — java.lang.String — URL на который должен быть совершен редирект

    Возвращаемое значение: void.

    Особенности работы метода:

    throws: IOException – если произошла ошибка ввода/вывода

    IllegalStateException – если response был отправлен (commited в документации HttpServletResponse) до того, как вызван этот метод ИЛИ если URL была передана в неверном формате

    Пример использования:

    Copy
    http://localhost:8080/sd/services/rest/exec-post?accessKey=41cf3619-aa04-4b68-ba5b-08dacdec3669&func=modules.someModule.getHtml&params=request,response

    def getHtml(def request, def response)
    {
      response.sendRedirect('https://google.com')
    }
  • setDateHeader(java.lang.String name, long date)

    Описание: Устанавливает заголовок ответа с указанным именем и датой-значением.

    Параметры:

    • name — java.lang.String — название заголовка, устанавливаемого в request;
    • date — long — дата и время в формате количества миллисекунд с 01 января 1970 года.

    Возвращаемое значение: void.

    Пример использования:

    Copy
    http://localhost:8080/sd/services/rest/exec-post?accessKey=41cf3619-aa04-4b68-ba5b-08dacdec3669&func=modules.someModule.getHtml&params=request,response

    def getHtml(def request, def response)
    {
      response.setDateHeader('header', 1636353934218L)
      return '<HTML><HEAD><TITLE>Test</TITLE></HEAD></HTML>'
    }
  • setHeader(java.lang.String name, java.lang.String value)

    Описание: Устанавливает заголовок ответа с указанным именем и значением.

    Параметры:

    • name — java.lang.String — название заголовка, устанавливаемого в request
    • value — java.lang.String — устанавливаемое значение заголовка. Если содержит бинарные данные в формате 16-ичных значений ("FFAA" = 0xFFAA, "1C28" = 0x1C28), то оно должно быть закодировано в соответствии с RFC 2047 (http://www.ietf.org/rfc/rfc2047.txt)

    Возвращаемое значение: void.

    Пример использования:

    Copy
    http://localhost:8080/sd/services/rest/exec-post?accessKey=41cf3619-aa04-4b68-ba5b-08dacdec3669&func=modules.someModule.getHtml&params=request,response

    def getHtml(def request, def response)
    {
      response.setHeader('header', 'value')
      return '<HTML><HEAD><TITLE>Test</TITLE></HEAD></HTML>'
    }
  • setIntHeader(java.lang.String name, int value)

    Описание: Устанавливает заголовок ответа с заданным именем и целочисленным значением

    Параметры:

    • name — java.lang.String — название заголовка, устанавливаемого в request;
    • value — int — устанавливаемое целочисленное значение заголовка.

    Возвращаемое значение: void.

    Пример использования:

    Copy
    http://localhost:8080/sd/services/rest/exec-post?accessKey=41cf3619-aa04-4b68-ba5b-08dacdec3669&func=modules.someModule.getHtml&params=request,response

    def getHtml(def request, def response)
    {
      response.setIntHeader('header', 123)
      return '<HTML><HEAD><TITLE>Test</TITLE></HEAD></HTML>'
    }
  • setStatus(int sc)

    Описание: Устанавливает код состояния для этого ответа.

    Параметр:

    • sc — int — код статуса response в формате 2XX, 3XX, 4XX или 5XX.

    Возвращаемое значение: void.

    Пример использования:

    Copy
    http://localhost:8080/sd/services/rest/exec-post?accessKey=41cf3619-aa04-4b68-ba5b-08dacdec3669&func=modules.someModule.getHtml&params=request,response

    def getHtml(def request, def response)
    {
      response.setStatus(201)
      return '<HTML><HEAD><TITLE>Test</TITLE></HEAD></HTML>'
    }

exec. Выполнение скрипта через запрос GET

В случае если отправка файла со скриптом в POST запросе невозможна, то скрипт можно оформить в модуль. После загрузки модуля в приложение GET запрос выполняется через функции, определенные в модуле.

Адрес: "/exec"
Метод вызова: GET

Параметры метода:

  • accessKey — ключ доступа;
  • func (обязательный) — название модуля и функции, вызываемой из этого модуля: func=modules.moduleCode.methodName

    • moduleCode — код модуля;
    • methodName — вызываемый метод (функция) модуля.
  • params (обязательный) — параметры метода (функции): &params=param1,param2 либо &params= , если параметров нет. Строка с параметрами должна быть корректна закодирована по правилам HTTP.

    Если в параметрах используются русские буквы, нужно убедиться в правильной настройке сервера приложений и NGINX/IIS (если используются).

Пример вызова метода: Вызов метода "someMethod" модуля "restModule" с параметрами "Какой-то текст", 10 и "Some data", и ключом доступа:

http://localhost:8888/sd/services/rest/exec?accessKey=db1ba6f4-c440-437d-b4ce-e965cf4516d7&func=modules.restModule.someMethod&params=%22%D0%9A%D0%B0%D0%BA%D0%BE%D0%B9-%D1%82%D0%BE%20%D1%82%D0%B5%D0%BA%D1%81%D1%82%22,10,%22Some%20data%22

Особенности работы метода

  • При выполнении скрипта проверка прав не производится. Проверка прав при выполнении метода включается в конфигурационном файле системы dbaccess.properties (REST API). По умолчанию проверка отключена.
  • В вызываемом методе скриптового модуля будет присутствовать контекстная переменная user, которая аналогична объекту user, полученному через params.

    Эта же переменная user попадет в скрипты, которые инициируются после выполнения указанного метода (функции).

    Пример: methodName создает объект → выполняется действие по событию "добавление объекта" → в скрипте этого действия по событию используется контекстная переменная user (исходный сотрудник).

  • Данный метод доступен для выполнения обычным пользователями. Аналогичный по названию POST-метод имеет совсем иное назначение и может выполняться только под суперпользователем.

Метода также касаются разделы Допустимые символы для передачи в параметрах метода (params), Получение дополнительной информации о запросе в параметрах метода (params) и Подробнее о параметре response из описания метода exec-post

execM2H. Выполнение скрипта через GET с предварительным вводом логина и пароля

Адрес: "/execM2H"
Метод вызова: GET

Параметры метода:

  • accessKey — ключ доступа для пользователя. Необязательный параметр;
  • func (обязательный) — название модуля и функции, вызываемой из этого модуля: func=modules.moduleCode.methodName

    • moduleCode — код модуля;
    • methodName — вызываемый метод (функция) модуля.
  • params (обязательный) — параметры метода (функции): &params=param1,param2 либо &params= , если параметров нет. Строка с параметрами должна быть корректна закодирована по правилам HTTP.

    Если в параметрах используются русские буквы, нужно убедиться в правильной настройке сервера приложений и NGINX/IIS (если используются)

Пример. Вызов метода "someMethod" модуля "restModule" с параметрами "Какой-то текст", 10 и "Some data":

http://localhost:8888/sd/services/rest/execM2H?func=modules.restModule.someMethod&params=%22%D0%9A%D0%B0%D0%BA%D0%BE%D0%B9-%D1%82%D0%BE%20%D1%82%D0%B5%D0%BA%D1%81%D1%82%22,10,%22Some%20data%22

Особенности работы метода:

  • При выполнении скрипта проверка прав не производится. Проверка прав при выполнении метода включается в конфигурационном файле системы dbaccess.properties (REST API). По умолчанию проверка отключена.
  • В вызываемом методе скриптового модуля будет присутствовать контекстная переменная user, которая аналогична объекту user, полученному через params.

    Эта же переменная user попадет в скрипты, которые инициируются после выполнения указанного метода (функции).

    Пример: methodName создает объект → выполняется действие по событию "добавление объекта" → в скрипте этого действия по событию используется контекстная переменная user (исходный сотрудник).

Метода также касаются разделы Допустимые символы для передачи в параметрах метода (params), Получение дополнительной информации о запросе в параметрах метода (params) и Подробнее о параметре response из описания метода exec-post

get-file-by-func. Скачивание файла с помощью вызова метода из модуля

Адрес: "/get-file-by-func=modules.<код модуля>.<имя метода>&params=" "

Описание:

Метод из модуля возвращает uuid файла в системе.

После func= указывается ключевое слово modules, через точку код модуля, через точку название метода и &params=.

Если параметров нет, то больше ничего не указывается.

Если параметры есть, то они указываются далее через запятую без пробелов.

Проверка прав при выполнении метода включается в конфигурационном файле системы dbaccess.properties (REST API). По умолчанию проверка отключена.

Если проверка включена, то вызов метода выполняется с правами:

  • текущего сотрудника — если пользователь уже авторизован в системе или настроена прозрачная аутентификация и в параметрах метода не передан accessKey;
  • пользователя, чей accessKey был передан, независимо от наличия авторизации вызывающего — если accessKey указан в параметрах метода.

Если нет авторизации и не передан accessKey, то метод возвращает ошибку

Пример ссылки:

http://localhost:8888/services/rest/get-file-by-func?accessKey=e2469fa1-123c-492d-ada3-42f8be19afa8&func=modules.m2.getFileUuid&params=123,qwerty

Пример модуля:

Copy
<scriptStorage>
<modules>
<module productVersion="4.5.1">
<code>test1</code>
<moduleVersion>1</moduleVersion>
<description></description>
<active>true</active>
<script checksum="72b25121d9bfcab96b5177232e0bd1c50630d6fca85fcf12644de80abe20fd83"><![CDATA[/*! UTF-8 */
def getReportFile(def code)
{
return utils.findFirst('listReport', ['reportCode': code]).reportFile?.get(0)?.UUID;
}
]]></script>
</module>
</modules>
</scriptStorage>

createWithRedirect. Создание объекта с переадресацией

Описание метода createWithRedirect

editWithRedirect. Редактирование объекта с переадресацией

Описание метода editWithRedirect

deleteWithRedirect. Удаление объекта с переадресацией

Описание метода deleteWithRedirect

Параметр response

response — ответ на запрос javax.servlet.http.HttpServletResponse (позволяет выполнить редирект или проставить заголовки).

В методе модуля response передается в параметре:

http://localhost:8080/sd/services/rest/exec-post?accessKey=b8f7a2e3-e8b9-41bd-97ec-d0a91158792b&func=modules.someModule.test&params=request,response

В сигнатуре метода аналогично указывается

def test (def request, def response)
{
...
}

Возвращаемый тип ответа

У response можно установить ContentType с помощью метода setContentType(String contentType), где строка contentType может принимать одно из общепринятых значений MIME-типов. В итоге результат выполнения API-метода будет с проставленным content-type.

Пример модуля:

Copy
http://localhost:8080/sd/services/rest/exec-post?accessKey=41cf3619-aa04-4b68-ba5b-08dacdec3669&func=modules.someModule.test&params=request,response
def getHtml(def request, def response)
{
response.setContentType('text/html; charset=UTF-8')
return '<HTML><HEAD><TITLE>Test</TITLE></HEAD></HTML>'
}

Результат выполнение такого модуля будет с content-type: text/html;charset=UTF-8:

Copy
Headers:
cache-control → no-cache, no-store, max-age=0, must-revalidate
connection → keep-alive
content-type → text/html;charset=UTF-8
...
responseurl → /sd/services/rest/exec-post?accessKey=41cf3619-aa04-4b68-ba5b-08dacdec3669&func=modules.test.getHtml&params=request,response
Body:
<HTML>
   <HEAD>
       <TITLE>Test</TITLE>
   </HEAD>
</HTML>

Этот же модуль без setContentType:

Copy
http://localhost:8080/sd/services/rest/exec-post?accessKey=41cf3619-aa04-4b68-ba5b-08dacdec3669&func=modules.someModule.test&params=request,response
def getHtml(def request, def response)
{
return '<HTML><HEAD><TITLE>Test</TITLE></HEAD></HTML>'
}

Результат выполнение такого модуля будет с content-type: application/json;charset=UTF-8:

Copy
Headers:
cache-control → no-cache, no-store, max-age=0, must-revalidate
connection → keep-alive
content-type → application/json;charset=UTF-8
...
responseurl → /sd/services/rest/exec-post?accessKey=41cf3619-aa04-4b68-ba5b-08dacdec3669&func=modules.test.getHtml&params=request,response
Body:
Unexpected '<'

Методы, доступные в response

addDateHeader(name, date)

Описание: Добавляет заголовок ответа с указанным именем и датой-значением.

Параметры:

  • name — название заголовка, добавляемого в request. java.lang.String;
  • date — дата и время в формате количества миллисекунд с 01 января 1970 года. long.

Возвращаемое значение: void

Пример:

Copy
http://localhost:8080/sd/services/rest/exec-post?accessKey=41cf3619-aa04-4b68-ba5b-08dacdec3669&func=modules.someModule.getHtml&params=request,response
def getHtml(def request, def response)
{
response.addDateHeader('dateHeader', 1636353934218L)
return '<HTML><HEAD><TITLE>Test</TITLE></HEAD></HTML>'
}

addHeader(name, value)

Описание: Добавляет заголовок ответа с указанным именем и значением.

Параметры:

  • name — java.lang.String — название заголовка, добавляемого в request;
  • value — java.lang.String — добавляемое значение заголовка. Если содержит бинарные данные в формате 16-ричных значений ("FFAA" = 0xFFAA, "1C28" = 0x1C28), то оно должно быть закодировано в соответствии с RFC 2047 (http://www.ietf.org/rfc/rfc2047.txt).
Возвращаемое значение: void

Пример:

Copy
http://localhost:8080/sd/services/rest/exec-post?accessKey=41cf3619-aa04-4b68-ba5b-08dacdec3669&func=modules.someModule.getHtml&params=request,response
def getHtml(def request, def response)
{
response.addHeader('header', "value")
return '<HTML><HEAD><TITLE>Test</TITLE></HEAD></HTML>'
}

addIntHeader(name, value)

Описание: Добавляет заголовок ответа с указанным именем и целочисленным значением.

Параметры:

  • name — java.lang.String — название заголовка, добавляемого в request;
  • value — int — добавляемое целочисленное значение заголовка.
Возвращаемое значение: void

Пример:

Copy
http://localhost:8080/sd/services/rest/exec-post?accessKey=41cf3619-aa04-4b68-ba5b-08dacdec3669&func=modules.someModule.getHtml&params=request,response
def getHtml(def request, def response)
{
response.addIntHeader('header', 123)
return '<HTML><HEAD><TITLE>Test</TITLE></HEAD></HTML>'
}

containsHeader(name)

Описание: Возвращает логическое значение, указывающее, был ли заданный заголовок ответа уже установлен.

Параметр:

  • name — java.lang.String — название искомого заголовка в request.

Возвращаемое значение:

  • boolean — true, если заголовок с таким названием содержится в response;
  • false — в противном случае.

Пример:

Copy
http://localhost:8080/sd/services/rest/exec-post?accessKey=41cf3619-aa04-4b68-ba5b-08dacdec3669&func=modules.someModule.getHtml&params=request,response
def getHtml(def request, def response)
{
def hasHeader = response.containsHeader('header')
return hasHeader ? '<HTML><HEAD><TITLE>Test1</TITLE></HEAD></HTML>' : '<HTML><HEAD><TITLE>Test2</TITLE></HEAD></HTML>'
}

getHeader(name)

Описание: Получает значение заголовка ответа с заданным именем.

Параметр:

  • name — java.lang.String — название заголовка в request.

Возвращаемое значение:

  • java.lang.String — значение заголовка с переданным названием;
  • null, если такого заголовка нет в response.

Пример:

Copy
http://localhost:8080/sd/services/rest/exec-post?accessKey=41cf3619-aa04-4b68-ba5b-08dacdec3669&func=modules.someModule.getHtml&params=request,response
def getHtml(def request, def response)
{
def headerValue = response.getHeader('header')
return "<HTML><HEAD><TITLE>Test ${headerValue}</TITLE></HEAD></HTML>"
}

getHeaderNames()

Описание: Получает имена заголовков этого ответа

Возвращаемое значение: java.util.Collection<java.lang.String> — коллекция (возможно пустая) названий заголовков, содержащихся в response

Пример:

Copy
http://localhost:8080/sd/services/rest/exec-post?accessKey=41cf3619-aa04-4b68-ba5b-08dacdec3669&func=modules.someModule.getHtml&params=request,response
def getHtml(def request, def response)
{
def headers = response.getHeaderNames()
return "<HTML><HEAD><TITLE>Test ${headers}</TITLE></HEAD></HTML>"
}

getHeaders(name)

Описание: Получает значение заголовка ответа с заданным именем.

Параметр:

  • name — java.lang.String — название заголовка в request.
Возвращаемое значение: java.util.Collection<java.lang.String> — коллекция (возможно пустая) значений заголовков, с переданным именем.

Пример:

Copy
http://localhost:8080/sd/services/rest/exec-post?accessKey=41cf3619-aa04-4b68-ba5b-08dacdec3669&func=modules.someModule.getHtml&params=request,response
def getHtml(def request, def response)
{
def headers = response.getHeaders('header')
return "<HTML><HEAD><TITLE>Test ${headers}</TITLE></HEAD></HTML>"
}

getStatus()

Описание: Получает текущий код состояния этого ответа.

Возвращаемое значение: int — текущий код статуса response.

Пример:

Copy
http://localhost:8080/sd/services/rest/exec-post?accessKey=41cf3619-aa04-4b68-ba5b-08dacdec3669&func=modules.someModule.getHtml&params=request,response
def getHtml(def request, def response)
{
def status = response.getStatus()
return "<HTML><HEAD><TITLE>Test ${status}</TITLE></HEAD></HTML>"
}

sendError(sc)

Описание: Отправляет клиенту ответ об ошибке, используя указанный код состояния, и очищает буфер.

Параметр:

  • sc — int — код статуса отправляемой ошибке в формате 2XX, 3XX, 4XX или 5XX.
Возвращаемое значение: void

Особенности работы метода:

throws: IOException – если произошла ошибка ввода/вывода.

IllegalStateException – если response был отправлен (commited в документации HttpServletResponse) до того, как вызван этот метод.

Пример:

Copy
http://localhost:8080/sd/services/rest/exec-post?accessKey=41cf3619-aa04-4b68-ba5b-08dacdec3669&func=modules.someModule.getHtml&params=request,response
def getHtml(def request, def response)
{
response.sendError(404)
}

sendError(sc, msg)

Описание: Отправляет клиенту ответ об ошибке, используя указанный статус, и очищает буфер.

Параметры:

  • sc — int — код статуса отправляемой ошибке в формате 2XX, 3XX, 4XX или 5XX;
  • msg — java.lang.String — описание ошибки.
Возвращаемое значение: void

Особенности работы метода:

throws: IOException – если произошла ошибка ввода/вывода.

IllegalStateException – если response был отправлен (commited в документации HttpServletResponse) до того, как вызван этот метод.

Пример:

Copy
http://localhost:8080/sd/services/rest/exec-post?accessKey=41cf3619-aa04-4b68-ba5b-08dacdec3669&func=modules.someModule.getHtml&params=request,response
def getHtml(def request, def response)
{
response.sendError(404, 'Not found page')
}

sendRedirect(location)

Описание: Отправляет временный ответ перенаправления клиенту, используя указанный URL-адрес местоположения перенаправления, и очищает буфер.

Параметр:

  • location — java.lang.String — URL на который должен быть совершен редирект.
Возвращаемое значение: void

Особенности работы метода:

throws: IOException – если произошла ошибка ввода/вывода.

IllegalStateException – если response был отправлен (commited в документации HttpServletResponse) до того, как вызван этот метод ИЛИ если URL была передана в неверном формате

Пример:

Copy
http://localhost:8080/sd/services/rest/exec-post?accessKey=41cf3619-aa04-4b68-ba5b-08dacdec3669&func=modules.someModule.getHtml&params=request,response
def getHtml(def request, def response)
{
response.sendRedirect('https://google.com')
}

setDateHeader(name, date)

Описание: Устанавливает заголовок ответа с указанным именем и датой-значением.

Параметры:

  • name — java.lang.String — название заголовка, устанавливаемого в request;
  • date — long — дата и время в формате количества миллисекунд с 01 января 1970 года.
Возвращаемое значение: void

Пример:

Copy
http://localhost:8080/sd/services/rest/exec-post?accessKey=41cf3619-aa04-4b68-ba5b-08dacdec3669&func=modules.someModule.getHtml&params=request,response
def getHtml(def request, def response)
{
response.setDateHeader('header', 1636353934218L)
return '<HTML><HEAD><TITLE>Test</TITLE></HEAD></HTML>'
}

setHeader(name, value)

Описание: Устанавливает заголовок ответа с указанным именем и значением.

Параметры:

  • name — java.lang.String — название заголовка, устанавливаемого в request;
  • value — java.lang.String — устанавливаемое значение заголовка. Если содержит бинарные данные в формате 16-ичных значений ("FFAA" = 0xFFAA, "1C28" = 0x1C28), то оно должно быть закодировано в соответствии с RFC 2047 (http://www.ietf.org/rfc/rfc2047.txt).
Возвращаемое значение: void

Пример:

Copy
http://localhost:8080/sd/services/rest/exec-post?accessKey=41cf3619-aa04-4b68-ba5b-08dacdec3669&func=modules.someModule.getHtml&params=request,response
def getHtml(def request, def response)
{
response.setHeader('header', 'value')
return '<HTML><HEAD><TITLE>Test</TITLE></HEAD></HTML>'
}

setIntHeader(name, value)

Описание: Устанавливает заголовок ответа с заданным именем и целочисленным значением.

Параметры:

  • name — java.lang.String — название заголовка, устанавливаемого в request;
  • value — int — устанавливаемое целочисленное значение заголовка.
Возвращаемое значение: void

Пример:

Copy
http://localhost:8080/sd/services/rest/exec-post?accessKey=41cf3619-aa04-4b68-ba5b-08dacdec3669&func=modules.someModule.getHtml&params=request,response
def getHtml(def request, def response)
{
response.setIntHeader('header', 123)
return '<HTML><HEAD><TITLE>Test</TITLE></HEAD></HTML>'
}

setStatus(sc)

Описание: Устанавливает код состояния для этого ответа.

Параметр:

  • sc — int — код статуса response в формате 2XX, 3XX, 4XX или 5XX
Возвращаемое значение: void

Пример:

Copy
http://localhost:8080/sd/services/rest/exec-post?accessKey=41cf3619-aa04-4b68-ba5b-08dacdec3669&func=modules.someModule.getHtml&params=request,response
def getHtml(def request, def response)
{
response.setStatus(201)
return '<HTML><HEAD><TITLE>Test</TITLE></HEAD></HTML>'
}