Progettare la logica del server

Crea la logica del server nell'area di lavoro Configura in studio di progettazione. Ogni record di logica del server rappresenta una logica lato server distinta che è possibile richiamare da uno script client usando verbi HTTP supportati o da un modello Liquid durante il rendering della pagina sul lato server.

Passaggi per creare la logica del server

  1. Accedere a Power Pages.
  2. Selezionare sito e modifica.
  3. Passare all'area di lavoro Configura e quindi selezionare Logica server.
  4. Selezionare +Nuova logica del server.
  5. Immettere un nome per la logica del server. L'API usa questo nome come identificatore di risorsa quando si costruisce l'API per la logica del server.
  6. Selezionare +Aggiungi ruoli per assegnare il ruolo Web appropriato.
  7. Selezionare i tre puntini (...) accanto al nome e selezionare Modifica codice.
  8. Selezionare Apri Visual Studio Code per creare la logica personalizzata.

Chiamare logica su server dallo script cliente

Annotazioni

Ogni richiesta alla logica del server deve includere un token CSRF (Cross-Site Request Forgery). In generale, il metodo shell.safeAjax esegue il wrapping del token CSRF. Per altre informazioni su come costruire le richieste, vedere Funzione AJAX wrapper CSRF.

Esempio: invocazione del metodo HTTP GET

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

Esempio: la chiamata a 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");
  }
});

Esempio: utilizzo di 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");
  }
});

Esempio: chiamare 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");
  }
});

Esempio: chiamata HTTP DELETE

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

Esempio: risposta

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

Chiamare la logica del server da Liquid

Usare il tag Liquid per richiamare la logica del server mentre viene eseguito il serverlogic rendering di una pagina o di un modello Web. Questa chiamata lato server non richiede una richiesta HTTP sul lato client o un token CSRF (Cross-Site Request Forgery).

Assegnare il record della logica del server a un ruolo Web a cui l'utente del sito Web corrente può accedere.

Per la sintassi completa, i parametri di input e gli attributi restituiti, vedere l'oggettoserverlogic Liquid.

Richiamare la logica del server senza input

Creare una funzione nel record della logica del server.

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

Richiamare la funzione da una pagina o da un modello Web:

{% 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 %}

In questo esempio:

  • customer-summary è il nome del record della logica del server.
  • getSummary è la funzione JavaScript da richiamare.
  • result è la variabile Liquid contenente il risultato dell'operazione.
  • result.data contiene il codice JSON analizzato restituito da getSummary.

Passare l'input alla logica del server

Usare il parametro facoltativo input per passare una stringa all'operazione di logica del server. Usare JSON quando è necessario passare dati strutturati.

{% 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 %}

Leggere l'input nella funzione logica del server tramite Server.Context.Input:

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

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

Convalidare l'input prima di usarlo nelle operazioni di Dataverse o passarlo a un servizio esterno.

Annotazioni

La logica del server richiamata da Liquid viene eseguita mentre viene eseguito il rendering della pagina. Le operazioni dataverse a esecuzione prolungata o le richieste HTTP esterne aumentano il tempo di risposta della pagina.

Limitations

Quando si crea la logica del server, si applicano le limitazioni seguenti:

  • Le API specifiche del browser non sono supportate
    La logica del server viene eseguita in un ambiente server e non supporta API o librerie basate su browser.
    Gli esempi includono fetch, XMLHttpRequeste altre funzionalità correlate a DOM.

  • Parole chiave e modelli con restrizioni
    Per mantenere un ambiente di esecuzione sicuro, il sistema convalida gli script della logica del server e rifiuta quelli che contengono determinate parole chiave non sicure o con restrizioni. Queste parole chiave includono quelle che abilitano l'esecuzione dinamica del codice, il controllo del processo o la manipolazione del prototipo.

    I modelli seguenti non sono consentiti:

    __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
    

Passo successivo

Oggetti server

Panoramica della logica del server
Come interagire con le tabelle di Dataverse usando la logica del server