Esercizio - Uso di codice personalizzato

Completato

In questo esercizio si aggiungerà una nuova operazione a un connettore personalizzato esistente. Si userà quindi il codice personalizzato per implementare l'operazione e trasformare la risposta.

Si modificherà il connettore personalizzato Contoso Invoicing che include un'operazione ListInvoice ma non un'operazione LastInvoice. Di conseguenza, si aggiungerà l'operazione LastInvoice per recuperare la fattura creata più di recente. L'API di rete per Contoso Invoicing non supporta questa operazione, quindi si usa il codice personalizzato in esecuzione nell'operazione LastInvoice per reindirizzare la richiesta a ListInvoice nell'API e trasformare la risposta in modo che restituisca solo l'ultima fattura creata.

Importante

Usare un ambiente di test in cui sia stato effettuato il provisioning di Microsoft Dataverse. Se non se ne ha già uno, passare al Piano per sviluppatori Microsoft Power Apps per iscriversi al piano per sviluppatori.

Attività - Preparazione dell'ambiente

In questa attività si importerà una soluzione nell'ambiente in uso.

  1. Passare a Microsoft Power Automate e assicurarsi di trovarsi nell'ambiente corretto.

  2. Selezionare Dati > Connettori personalizzati nel riquadro di spostamento a sinistra.

  3. Verificare di disporre già del connettore personalizzato Contoso Invoicing nell'ambiente.

    Screenshot che mostra il connettore personalizzato.

  4. Se il connettore personalizzato Contoso Invoicing è già presente nell'ambiente, passare direttamente all'attività successiva di questo esercizio. Se il connettore personalizzato non è presente, continuare con il passaggio 5.

  5. Selezionare Soluzioni > Importa.

  6. Selezionare Sfoglia.

  7. Selezionare la soluzione ContosoInvoicingExtensions_1_0_0_0.zip che si trova nella cartella delle risorse, quindi selezionare Apri.

  8. Selezionare Avanti.

  9. Selezionare Importa e attendere il completamento dell'importazione. Al termine dell'importazione, dovrebbe apparire un messaggio di operazione riuscita.

  10. Selezionare Pubblica tutte le personalizzazioni e attendere il completamento della pubblicazione. Non uscire da questa pagina.

Attività - Creazione dell'operazione LastInvoice

In questa attività si creerà una nuova operazione nel connettore personalizzato Contoso Invoicing.

  1. Selezionare la soluzione Contoso Invoicing - Extensions importata. Il componente connettore personalizzato Contoso Invoicing - Extensions dovrebbe apparire.

  2. Selezionare il connettore Contoso Invoicing - Extensions, quindi selezionare Modifica. È possibile che il connettore non includa Extensions nel nome se lo si è creato da un altro esercizio, ma questo non è un problema.

    Screenshot del pulsante di modifica della soluzione.

  3. Selezionare la scheda Definizione, quindi + Nuova azione.

    Screenshot che mostra il pulsante di creazione della nuova azione.

  4. Passare alla sezione Richiesta e selezionare + Importa da esempio.

    Screenshot che mostra il pulsante di importazione dall'esempio.

  5. Nella sezione Verbo selezionare Get, incollare https://contosoinvoicingtest.azurewebsites.net/GetLastInvoice nella casella URL, quindi selezionare Importa.

    Screenshot che mostra la finestra di dialogo di importazione della richiesta dall'esempio.

  6. Scorrere verso il basso fino alla sezione Risposta e selezionare + Aggiungi risposta predefinita.

    Screenshot che mostra il pulsante di aggiunta della risposta predefinita.

  7. Incollare il seguente codice JSON nel campo Corpo, quindi selezionare Importa.

    {
      "invoiceId": "1934",
      "date": "2023-03-19T06:55:45.9039452+00:00",
      "createDate": "2023-03-14T06:55:45.9039456Z",
      "amount": 8000,
      "accountId": "1001",
      "accountName": "Wing Tips",
      "status": "Invoiced",
      "typeId": 1,
      "purchaseOrderId": "3004",
      "tags": "New Account;Special Pricing;Non-returnable"
    }
    
  8. Selezionare la scheda Test, scegliere Aggiorna connettore e attendere il completamento dell'aggiornamento.

    Screenshot che mostra il pulsante di aggiornamento del connettore.

  9. Aprire una nuova finestra o scheda del browser, quindi passare a Contoso Invoicing.

  10. Selezionare il collegamento Chiave API.

  11. Copiare la chiave API.

  12. Salvare la chiave in un blocco note.

  13. Tornare al connettore, selezionare la scheda Test, quindi selezionare + Nuova connessione.

    Screenshot del pulsante di aggiunta della nuova connessione.

  14. Incollare la chiave copiata nel campo Chiave API, quindi selezionare Crea connessione.

  15. Selezionare Aggiornaconnessioni.

  16. Scorrere verso il basso fino alla sezione Operazioni, selezionare GetLastInvoice, quindi Verifica operazione.

    Screenshot del pulsante di verifica dell'operazione.

    Si dovrebbe ricevere un errore 404 perché l'API non dispone di un'operazione GetLastInvoice.

    Screenshot che mostra l'operazione non riuscita.

    Non uscire da questa pagina.

Attività - Aggiunta di codice al connettore

In questa attività si aggiungerà il codice che esegue l'operazione GetLastInvoice.

  1. Selezionare la scheda Codice, quindi attivare l'interruttore Codice abilitato.

    Screenshot che mostra l'interruttore di abilitazione del codice.

  2. Selezionare il menu a discesa Operazioni, quindi selezionare l'operazione GetLastInvoice.

    Screenshot che mostra l'operazione selezionata.

  3. Incollare il seguente codice nel campo Codice, quindi selezionare la scheda Test.

    public class Script : ScriptBase
    {
        public override async Task<HttpResponseMessage> ExecuteAsync()
        {
            // Check if the operation ID matches what is specified in the OpenAPI definition of the connector
            if (String.Equals(this.Context.OperationId, "GetLastInvoice", StringComparison.OrdinalIgnoreCase))
            {
                this.Context.Request.RequestUri = ReplaceUri(this.Context.Request.RequestUri, "GetLastInvoice", "ListInvoices");
                return await this.HandleGetLastInvoiceOperation().ConfigureAwait(false);
            }
            else
            {
                //pass-thru any other operation to the API directly
                return await this.HandleForwardOperation().ConfigureAwait(false);
            }
        }
        private Uri ReplaceUri(Uri original, string fromValue, string toValue)
        {
            try
            {
                var builder = new UriBuilder(original.ToString().Replace(fromValue, toValue));
                return builder.Uri;
            }
            catch (Exception ex)
            {
                throw new Exception(original.ToString().Replace(fromValue, toValue));
            }
        }
        private async Task<HttpResponseMessage> HandleGetLastInvoiceOperation()
        {
            JObject newResult = null;
            // Use the context to send an HTTP request
            HttpResponseMessage response = await this.Context.SendAsync(this.Context.Request, this.CancellationToken).ConfigureAwait(continueOnCapturedContext: false);
            // Do the transformation if the response was successful, otherwise return error responses as-is
            if (response.IsSuccessStatusCode)
            {
                if (response.StatusCode == HttpStatusCode.OK)
                {
                    var responseString = await response.Content.ReadAsStringAsync().ConfigureAwait(continueOnCapturedContext: false);
                    var result = JObject.Parse(responseString);
                    // Wrap the original JSON object into a new JSON object with just two properties
                    if (result != null && result.ContainsKey("invoices") && result["invoices"].HasValues)
                    {
                        var sortedArray = result["invoices"].OrderBy(jo => (DateTime)jo["date"]).ToArray();
                        var lastInvoice = sortedArray[0];
                        newResult = new JObject
                        {
                            ["invoiceid"]   = lastInvoice["invoiceid"],
                            ["date"]        = lastInvoice["date"],
                            ["createDate"]  = lastInvoice["createDate"],
                            ["amount"]      = lastInvoice["amount"],
                            ["accountId"]   = lastInvoice["accountId"],
                            ["accountName"] = lastInvoice["accountName"],
                            ["status"]      = lastInvoice["status"],
                            ["typeId"]      = lastInvoice["typeId"],
                            ["purchaseOrderId"] = lastInvoice["purchaseOrderId"],
                            ["tags"]        = lastInvoice["tags"]
    
                        };
                    }
                    else
                    {
                        newResult = new JObject
                        {
                            ["invoiceid"] = "-9999",
                            ["status"] = "No Invoices",
                        };
                    }
                }
                else
                {
                    newResult = new JObject
                        {
                            ["invoiceid"] = "-9999",
                            ["status"] = "Error retrieving invoices",
                        };
                }
                response.Content = CreateJsonContent(newResult.ToString());
                response.StatusCode = HttpStatusCode.OK;
            }
            return response;
        }
        private async Task<HttpResponseMessage> HandleForwardOperation()
        {
            // Use the context to forward/send an HTTP request
            HttpResponseMessage response = await this.Context.SendAsync(this.Context.Request, this.CancellationToken).ConfigureAwait(continueOnCapturedContext: false);
            return response;
        }
    }
    

    Screenshot che mostra il codice e la scheda di test.

  4. Esaminare il codice. Il codice dovrebbe contenere la seguente logica:

    • Controlla se si tratta dell'operazione GetLastInvoice e, in caso contrario, inoltra la richiesta non modificata all'API di rete

    • Modifica la richiesta in modo da usare l'operazione ListInvoice nell'API di rete

    • Richiama l'API di rete usando SendAsync

    • Trasforma la risposta per includere solo un singolo oggetto Invoice che è la fattura creata più di recente

  5. Selezionare la scheda Test, scegliere Aggiorna connettore e attendere il completamento dell'aggiornamento.

  6. Scorrere verso il basso fino alla sezione Operazioni, selezionare GetLastInvoice, quindi Verifica operazione.

    Screenshot dell'azione di verifica dell'operazione.

Si riceverà una risposta che mostra l'ultima fattura.

Screenshot che mostra la risposta dell'operazione.