Разработка логики сервера

Создайте логику сервера в рабочем пространстве "Настройка" в студии разработки. Каждая запись логики сервера представляет отдельную логику на стороне сервера, которую можно вызвать из клиентского скрипта с помощью поддерживаемых HTTP-команд или из шаблона Liquid во время отрисовки страниц на стороне сервера.

Действия по созданию логики сервера

  1. Войдите в Power Pages.
  2. Выберите сайт и изменить.
  3. Перейдите в рабочую область "Настройка " и выберите логику сервера.
  4. Нажмите кнопку +Создать логику сервера.
  5. Введите имя логики сервера. API использует это имя в качестве идентификатора ресурса при создании API логики сервера.
  6. Выберите +Добавить роли , чтобы назначить соответствующую веб-роль.
  7. Выберите три точки (...) рядом с именем и нажмите кнопку "Изменить код".
  8. Выберите «Открыть Visual Studio Code», чтобы создать пользовательскую логику.

Вызов логики сервера из клиентского скрипта

Замечание

Каждый запрос к логике сервера должен содержать токен CSRF (подделки межсайтовых запросов). Как правило, метод shell.safeAjax упаковывает токен CSRF. Дополнительные сведения о создании запросов см. в статье о функции AJAX оболочки CSRF.

Пример: вызов HTTP GET

shell.safeAjax({
  type: "GET",
  url: "/_api/serverlogics/serverlogicname?id=1",
  contentType: "application/json",
  success: function (res) {
    console.log(res);
  }
});

Пример: вызов HTTP POST

shell.safeAjax({
  type: "POST",
  url: "/_api/serverlogics/serverlogicname",
  contentType: "application/json",
  data: JSON.stringify({
    "name": "Sample name"
  }),
  success: function (res) {
    console.log("res");
  }
});

Пример: вызов HTTP PUT

shell.safeAjax({
  type: "PUT",
  url: "/_api/serverlogics/serverlogicname",
  contentType: "application/json",
  data: JSON.stringify({
    "name": "Sample name"
  }),
  success: function (res) {
    console.log("res");
  }
});

Пример: вызов HTTP PATCH

shell.safeAjax({
  type: "PATCH",
  url: "/_api/serverlogics/serverlogicname",
  contentType: "application/json",
  data: JSON.stringify({
    "name": "Sample name"
  }),
  success: function (res) {
    console.log("res");
  }
});

Пример: вызов HTTP DELETE

shell.safeAjax({
  type: "DELETE",
  url: "/_api/serverlogics/serverlogicname?id=1",
  contentType: "application/json"
  success: function (res) {
    console.log("res");
  }
});

Пример: ответ

{
  "RequestId": "811b363e-36d2-4213-9f44-a73bf7550ce8",
  "Success": true,
  "Data": "Sample data",
  "ExecutionTime": 9256.331,
  "ServerLogicName": "serverlogicname",
  "Error": null
}

Логика вызова сервера из Liquid

serverlogic Используйте тег Liquid для вызова логики сервера во время отрисовки страницы или веб-шаблона. Для этого вызова на стороне сервера не требуется клиентский HTTP-запрос или токен кросс-сайта forgery (CSRF).

Назначьте запись логики сервера веб-роли, доступ к которому может получить текущий пользователь веб-сайта.

Полный синтаксис, входные параметры и возвращенные атрибуты см. в объектеserverlogic Liquid.

Вызов логики сервера без ввода

Создайте функцию в записи логики сервера.

function getSummary() {
    return JSON.stringify({
        message: "Server logic invoked successfully",
        count: 42
    });
}

Вызов функции из страницы или веб-шаблона:

{% serverlogic name: 'customer-summary', operation: 'getSummary', output: result %}

{% if result.success %}
  <p>{{ result.data.message | escape }}</p>
  <p>Count: {{ result.data.count }}</p>
{% else %}
  <p>The customer summary couldn't be retrieved.</p>
{% endif %}

В этом примере:

  • customer-summary — имя записи логики сервера.
  • getSummary — это функция JavaScript для вызова.
  • result — переменная Liquid, содержащая результат операции.
  • result.data содержит проанализированный JSON, возвращенный getSummary.

Передача входных данных в логику сервера

Используйте необязательный input параметр для передачи строки в операцию логики сервера. Используйте JSON, когда необходимо передать структурированные данные.

{% assign inputData = '{"category":"active","maximumResults":5}' %}

{% serverlogic name: 'customer-summary', operation: 'getSummary', input: inputData, output: result %}

{% if result.success %}
  <p>Category: {{ result.data.category | escape }}</p>
  <p>Maximum results: {{ result.data.maximumResults }}</p>
{% endif %}

Чтение входных данных в функции логики сервера с помощью Server.Context.Input:

function getSummary() {
    var input = JSON.parse(Server.Context.Input || "{}");

    return JSON.stringify({
        message: "Summary retrieved",
        category: input.category,
        maximumResults: input.maximumResults
    });
}

Проверьте входные данные перед его использованием в операциях Dataverse или перед передачей его во внешнюю службу.

Замечание

Логика сервера, вызываемая из запуска Liquid во время отрисовки страницы. Длительные операции Dataverse или внешние HTTP-запросы увеличивают время отклика страницы.

Limitations

Следующие ограничения применяются при разработке логики сервера:

  • API для конкретного браузера не поддерживаются
    Серверная логика выполняется в серверной среде и не работает с браузерными API или библиотеками.
    Примеры включают fetch, XMLHttpRequest и другие функции, связанные с DOM.

  • Ограниченные ключевые слова и шаблоны
    Чтобы поддерживать безопасную среду выполнения, система проверяет скрипты логики сервера и отклоняет те, которые содержат определенные небезопасные или ограниченные ключевые слова. Эти ключевые слова включают те, которые обеспечивают динамическое выполнение кода, управление процессами или манипуляцию прототипом.

    Следующие шаблоны не допускаются.

    __dirname
    __filename
    import(, import from
    eval(, Function(
    setTimeout(, setInterval(, setImmediate(
    process.exit, process.kill, child_process
    fs., require(
    constructor.constructor, this.constructor, arguments.callee
    with(, delete
    Object.getPrototypeOf, Object.setPrototypeOf
    Proxy(, Reflect.
    Symbol.for
    __proto__, prototype
    debugger
    

Следующий шаг

Объекты сервера

Общие сведения о логике сервера
Взаимодействие с таблицами Dataverse с помощью логики сервера