Creare, modificare o estendere JSON per le definizioni del flusso di lavoro di app per la logica in App per la logica di Azure

Si applica a: App per la logica di Azure (consumo)

Quando si creano soluzioni di integrazione aziendale con flussi di lavoro automatizzati in App per la logica di Azure, le definizioni del flusso di lavoro sottostanti usano json (JavaScript Object Notation) semplice e dichiarativo insieme allo schema WDL (Workflow Definition Language) per la relativa descrizione e convalida. Questi formati semplificano la lettura e la comprensione delle definizioni del flusso di lavoro senza conoscere molto il codice. Quando si vuole automatizzare la creazione e la distribuzione delle risorse dell'app per la logica, è possibile includere le definizioni del flusso di lavoro come risorse di Azure all'interno dei modelli di Azure Resource Manager. Per creare, gestire e distribuire app per la logica, è quindi possibile usare Azure PowerShell, l'interfaccia della riga di comando di Azure o le API REST di App per la logica di Azure.

Per usare le definizioni del flusso di lavoro in JSON, aprire l'editor visualizzazione codice quando si lavora nel portale di Azure o in Visual Studio oppure copiare la definizione in qualsiasi editor desiderato. Se non si ha familiarità con App per la logica di Azure, vedere Creare un flusso di lavoro dell'app per la logica a consumo di esempio.

Nota

Alcune funzionalità App per la logica di Azure, ad esempio la definizione di parametri e più trigger nelle definizioni del flusso di lavoro, sono disponibili solo in JSON, non nella finestra di progettazione del flusso di lavoro. Pertanto, per queste attività è necessario lavorare nella visualizzazione Codice o in un altro editor.

Modificare JSON - Portale di Azure

  1. Accedere al portale di Azure.

  2. Dal menu a sinistra scegliere Tutti i servizi. Nella casella di ricerca cercare "app per la logica" e quindi selezionare l'app per la logica desiderata nei risultati.

  3. Nel menu dell'app per la logica, in Strumenti di sviluppo selezionare Visualizzazione codice app per la logica.

    Viene aperto l'editor visualizzazione codice e viene visualizzata la definizione del flusso di lavoro in formato JSON.

Modificare JSON - Visual Studio

Prima di poter usare la definizione del flusso di lavoro in Visual Studio, assicurarsi di aver installato gli strumenti necessari. Per creare un'app per la logica con Visual Studio, vedere Quickstart: Automate tasks and processes with Azure Logic Apps - Visual Studio (Guida introduttiva: Automatizzare attività e processi con App per la logica di Azure - Visual Studio).

In Visual Studio è possibile aprire le app per la logica che sono state create e distribuite direttamente dal portale di Azure o come progetti di Azure Resource Manager da Visual Studio.

  1. Aprire la soluzione di Visual Studio o il progetto del gruppo di risorse di Azure contenente l'app per la logica.

  2. Trovare e aprire la definizione del flusso di lavoro, che per impostazione predefinita viene visualizzata in un modello di Resource Manager, denominato LogicApp.json. È possibile usare e personalizzare questo modello per la distribuzione in ambienti diversi.

  3. Aprire il menu di scelta rapida per la definizione e il modello del flusso di lavoro. Selezionare Open With Logic App Designer (Apri con Progettazione app per la logica)

    Aprire un'app per la logica in una soluzione di Visual Studio

    Suggerimento

    Se non si dispone di questo comando in Visual Studio 2019, verificare di aver installato gli aggiornamenti più recenti per Visual Studio.

  4. Nella parte inferiore della finestra di progettazione del flusso di lavoro scegliere Visualizzazione codice.

    Viene aperto l'editor visualizzazione codice e viene visualizzata la definizione del flusso di lavoro in formato JSON.

  5. Per tornare alla visualizzazione della finestra di progettazione, nella parte inferiore dell'editor della visualizzazione Codice, scegliere Progettazione.

Parametri

Il ciclo di vita della distribuzione ha in genere ambienti diversi per lo sviluppo, il test, la gestione temporanea e la produzione. Quando si hanno valori da riutilizzare in tutta l'app per la logica senza hardcoding o che variano in base alle esigenze di distribuzione, è possibile creare un modello di Azure Resource Manager per la definizione del flusso di lavoro in modo da automatizzare anche la distribuzione di app per la logica.

Seguire questi passaggi generali per parametrizzare o definire e usare i parametri per tali valori. È quindi possibile specificare i valori in un file di parametri separato che passa tali valori al modello. In questo modo, è possibile modificare questi valori più facilmente senza dover aggiornare e ridistribuire l'app per la logica. Per informazioni dettagliate, vedere Panoramica: Automatizzare la distribuzione per le app per la logica con i modelli di Azure Resource Manager.

  1. Nel modello definire i parametri del modello e i parametri di definizione del flusso di lavoro per accettare i valori da usare rispettivamente in fase di distribuzione e runtime.

    I parametri del modello vengono definiti in una sezione dei parametri esterna alla definizione del flusso di lavoro, mentre i parametri di definizione del flusso di lavoro sono definiti in una sezione dei parametri all'interno della definizione del flusso di lavoro.

  2. Sostituire i valori hardcoded con espressioni che fanno riferimento a questi parametri. Le espressioni modello usano la sintassi diversa dalle espressioni di definizione del flusso di lavoro.

    Evitare di complicare il codice non usando espressioni modello, che vengono valutate in fase di distribuzione, all'interno di espressioni di definizione del flusso di lavoro, che vengono valutate in fase di esecuzione. Usare solo espressioni di modello esterne alla definizione del flusso di lavoro. Usare solo espressioni di definizione del flusso di lavoro all'interno della definizione del flusso di lavoro.

    Quando si specificano i valori per i parametri di definizione del flusso di lavoro, è possibile fare riferimento ai parametri del modello usando la sezione parametri esterna alla definizione del flusso di lavoro, ma ancora all'interno della definizione di risorsa per l'app per la logica. In questo modo, è possibile passare i valori dei parametri del modello nei parametri di definizione del flusso di lavoro.

  3. Archiviare i valori per i parametri in un file di parametri separato e includere il file con la distribuzione.

Elaborare le stringhe con le funzioni

App per la logica di Azure dispone di varie funzioni per l'uso delle stringhe. Si supponga, ad esempio, di voler passare un nome di società da un ordine a un altro sistema. Tuttavia, non si è certi di come gestire correttamente la codifica dei caratteri. Si potrebbe eseguire la codifica Base 64 su questa stringa, ma, per evitare caratteri di escape nell'URL, è invece possibile sostituire alcuni caratteri. Inoltre, è necessaria solo una sottostringa per il nome della società perché i primi cinque caratteri non vengono usati.

{
  "$schema": "https://schema.management.azure.com/schemas/2016-06-01/Microsoft.Logic.json",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "order": {
      "defaultValue": {
        "quantity": 10,
        "id": "myorder1",
        "companyName": "NAME=Contoso"
      },
      "type": "Object"
    }
  },
  "triggers": {
    "request": {
      "type": "Request",
      "kind": "Http"
    }
  },
  "actions": {
    "order": {
      "type": "Http",
      "inputs": {
        "method": "GET",
        "uri": "https://www.example.com/?id=@{replace(replace(base64(substring(parameters('order').companyName,5,sub(length(parameters('order').companyName), 5) )),'+','-') ,'/' ,'_' )}"
      }
    }
  },
  "outputs": {}
}

I passaggi seguenti descrivono come questa stringa viene elaborata nell'esempio, a partire dall'interno verso l'esterno:

"uri": "https://www.example.com/?id=@{replace(replace(base64(substring(parameters('order').companyName,5,sub(length(parameters('order').companyName), 5) )),'+','-') ,'/' ,'_' )}"
  1. Ottenere l'elemento length() per il nome della società per poter ottenere il numero totale di caratteri.

  2. Per ottenere una stringa più breve, sottrarre 5.

  3. Ottenere ora substring(). Iniziare dall'indice 5 e procedere alla parte rimanente della stringa.

  4. Convertire la sottostringa in una stringa base64().

  5. replace() sostituisce ora tutti i caratteri + con caratteri -.

  6. replace() sostituisce infine tutti i caratteri / con caratteri _.

Eseguire il mapping degli elementi di elenco ai valori delle proprietà, quindi usare le mappe come parametri

Per ottenere risultati diversi in base al valore di una proprietà, è possibile creare una mappa che associa ogni valore della proprietà a un risultato, quindi usare tale mappa come parametro.

Questo flusso di lavoro, ad esempio, definisce alcune categorie come parametri e una mappa che associa tali categorie a un URL specifico. Il flusso di lavoro ottiene prima di tutto un elenco degli articoli, quindi usa la mappa per trovare l'URL corrispondente alla categoria per ogni articolo.

  • La funzione intersection() controlla se la categoria corrisponde a una categorie nota definita.

  • Dopo avere ottenuto una categoria corrispondente, l'esempio esegue il pull dell'elemento dalla mappa usando le parentesi quadre: parameters[...]

{
  "$schema": "https://schema.management.azure.com/schemas/2016-06-01/Microsoft.Logic.json",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "specialCategories": {
      "defaultValue": [
        "science",
        "google",
        "microsoft",
        "robots",
        "NSA"
      ],
      "type": "Array"
    },
    "destinationMap": {
      "defaultValue": {
        "science": "https://www.nasa.gov",
        "microsoft": "https://www.microsoft.com/en-us/default.aspx",
        "google": "https://www.google.com",
        "robots": "https://en.wikipedia.org/wiki/Robot",
        "NSA": "https://www.nsa.gov/"
      },
      "type": "Object"
    }
  },
  "triggers": {
    "Request": {
      "type": "Request",
      "kind": "http"
    }
  },
  "actions": {
    "getArticles": {
      "type": "Http",
      "inputs": {
        "method": "GET",
        "uri": "https://ajax.googleapis.com/ajax/services/feed/load?v=1.0&q=https://feeds.wired.com/wired/index"
      }
    },
    "forEachArticle": {
      "type": "foreach",
      "foreach": "@body('getArticles').responseData.feed.entries",
      "actions": {
        "ifGreater": {
          "type": "if",
          "expression": "@greater(length(intersection(item().categories, parameters('specialCategories'))), 0)",
          "actions": {
            "getSpecialPage": {
              "type": "Http",
              "inputs": {
                "method": "GET",
                "uri": "@parameters('destinationMap')[first(intersection(item().categories, parameters('specialCategories')))]"
              }
            }
          }
        }
      },
      "runAfter": {
        "getArticles": [
          "Succeeded"
        ]
      }
    }
  }
}

Ottenere i dati con le funzioni di data

Per ottenere i dati da un'origine dati che non supporta i trigger in modo nativo, è possibile usare le funzioni di data per lavorare invece con ore e date. Questa espressione, ad esempio, trova quanto tempo richiedono i passaggi di questo flusso di lavoro, procedendo dall'interno verso l'esterno:

"expression": "@less(actions('order').startTime,addseconds(utcNow(),-1))",
  1. Dall'azione order estrarre startTime.

  2. Ottenere l'ora corrente con utcNow().

  3. Sottrarre un secondo:

    addseconds(..., -1)

    È possibile usare altre unità di tempo, ad esempio minutes o hours.

  4. È ora possibile confrontare questi due valori.

    Se il primo valore è minore del secondo valore, è trascorso più di un secondo dal momento in cui è stato inserito l'ordine.

Per formattare le date, è possibile usare formattatori di stringa. Per ottenere la specifica RFC1123, ad esempio, usare utcnow('r'). Altre informazioni sulla formattazione delle date.

{
  "$schema": "https://schema.management.azure.com/schemas/2016-06-01/Microsoft.Logic.json",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "order": {
      "defaultValue": {
        "quantity": 10,
        "id": "myorder-id"
      },
      "type": "Object"
    }
  },
  "triggers": {
    "Request": {
      "type": "request",
      "kind": "http"
    }
  },
  "actions": {
    "order": {
      "type": "Http",
      "inputs": {
        "method": "GET",
        "uri": "https://www.example.com/?id=@{parameters('order').id}"
      }
    },
    "ifTimingWarning": {
      "type": "If",
      "expression": "@less(actions('order').startTime,addseconds(utcNow(),-1))",
      "actions": {
        "timingWarning": {
          "type": "Http",
          "inputs": {
            "method": "GET",
            "uri": "https://www.example.com/?recordLongOrderTime=@{parameters('order').id}&currentTime=@{utcNow('r')}"
          }
        }
      },
      "runAfter": {
        "order": [
          "Succeeded"
        ]
      }
    }
  },
  "outputs": {}
}

Passaggi successivi