Übung – Benutzerdefinierten Code verwenden

Abgeschlossen

In dieser Übung fügen Sie einem bestehenden benutzerdefinierten Konnektor einen neuen Vorgang hinzu. Dann verwenden Sie benutzerdefinierten Code, um den Vorgang zu implementieren und die Antwort zu transformieren.

Sie ändern den benutzerdefinierten Contoso Invoicing-Konnektor, der über einen ListInvoice-Vorgang, aber keinen LastInvoice-Vorgang verfügt. Dann fügen Sie zum Abrufen der zuletzt erstellten Rechnung den Vorgang LastInvoice hinzu. Die Netzwerk-API für Contoso Invoicing unterstützt diesen Vorgang nicht. Sie verwenden daher benutzerdefinierten Code, der im Vorgang LastInvoice ausgeführt wird, um die Anforderung an ListInvoice auf der API umzuleiten und die Antwort so zu transformieren, dass nur die zuletzt erstellte Rechnung zurückgegeben wird.

Wichtig

Verwenden Sie eine Testumgebung mit bereitgestelltem Microsoft Dataverse. Wenn Sie noch nicht über eine Testumgebung verfügen, wechseln Sie zum Microsoft Power Apps-Entwicklerplan, um sich für den Entwicklerplan anzumelden.

Aufgabe: Ihre Umgebung vorbereiten

Sie importieren in dieser Aufgabe eine Lösung in Ihre Umgebung.

  1. Wechseln Sie zu Microsoft Power Automate, und stellen Sie sicher, dass Sie sich in der richtigen Umgebung befinden.

  2. Wählen Sie Daten > Benutzerdefinierte Konnektoren im linken Navigationsbereich aus.

  3. Stellen Sie sicher, dass Sie in Ihrer Umgebung bereits über den benutzerdefinierten Konnektor Contoso Invoicing verfügen.

    Screenshot des benutzerdefinierten Konnektors

  4. Wenn Sie in Ihrer Umgebung bereits über den benutzerdefinierten Konnektor Contoso Invoicing verfügen, fahren Sie mit der nächsten Aufgabe in dieser Übung fort. Wenn Sie nicht über den benutzerdefinierten Konnektor verfügen, fahren Sie mit Schritt 5 fort.

  5. Wählen Sie Lösungen > Importieren aus.

  6. Wählen Sie Durchsuchen aus.

  7. Wählen Sie die Lösungsdatei ContosoInvoicingExtensions_1_0_0_0.zip im Ressourcenordner und dann Öffnen aus.

  8. Wählen Sie Weiter aus.

  9. Wählen Sie Importieren aus, und warten Sie dann, bis der Import abgeschlossen ist. Nach Abschluss des Imports sollte eine Erfolgsmeldung angezeigt werden.

  10. Wählen Sie Alle Anpassungen veröffentlichen aus, und warten Sie dann, bis die Veröffentlichung abgeschlossen ist. Navigieren Sie nicht von dieser Seite weg.

Aufgabe: Den LastInvoice-Vorgang erstellen

In dieser Aufgabe erstellen Sie einen neuen Vorgang im benutzerdefinierten Contoso Invoicing-Konnektor.

  1. Wählen Sie die Lösung Contoso Invoicing Extensions aus, die Sie importiert haben. Die benutzerdefinierte Konnektorkomponente Contoso Invoicing ‑ Extensions sollte angezeigt werden.

  2. Wählen Sie den Konnektor Contoso Invoicing ‑ Extensions und dann Bearbeiten aus. Ihr Konnektor enthält möglicherweise keine Erweiterungen im Namen, wenn Sie ihn aus einer anderen Übung erstellt haben, was in Ordnung ist.

    Screenshot der Schaltfläche „Lösung bearbeiten“

  3. Wählen Sie die Registerkarte Definition und dann die Aktion + Neue Aktion aus.

    Screenshot der Schaltfläche „Neue Aktion erstellen“

  4. Navigieren Sie zum Abschnitt Anforderung, und wählen Sie + Aus Beispiel importieren aus.

    Screenshot mit der Schaltfläche „Aus einem Beispiel importieren“

  5. Wählen Sie aus dem Bereich Verb Get aus, und fügen Sie https://contosoinvoicingtest.azurewebsites.net/GetLastInvoice in das Feld URL ein. Klicken Sie dann auf Importieren.

    Screenshot mit der Importanforderung aus einem Beispiel-Dialogfeld

  6. Scrollen Sie nach unten zum Abschnitt Antwort, und wählen Sie + Standardantwort hinzufügen aus.

    Screenshot der Schaltfläche „Standardantwort hinzufügen“

  7. Fügen Sie den folgenden JSON in das Feld Text ein, und wählen Sie dann Importieren aus.

    {
      "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. Wählen Sie die Registerkarte Testen aus, und klicken Sie dann auf Konnektor aktualisieren. Warten Sie dann darauf, dass die Aktualisierung abgeschlossen wurde.

    Screenshot der Schaltfläche „Konnektor aktualisieren“

  9. Öffnen Sie ein neues Browserfenster oder eine neue Registerkarte, und gehen Sie dann zu Contoso Invoicing.

  10. Wählen Sie den Link API-Schlüssel aus.

  11. Kopieren Sie den API-Schlüssel.

  12. Speichern Sie diesen Schlüssel im Editor.

  13. Kehren Sie zum Konnektor zurück, wählen Sie die Registerkarte Testen und dann + Neue Verbindung aus.

    Screenshot der Schaltfläche „Neue Verbindung hinzufügen“

  14. Fügen Sie den Schlüssel ein, den Sie in das Feld API-Schlüssel kopiert haben, und wählen Sie dann Verbindung erstellen aus.

  15. Klicken Sie auf Verbindungenaktualisieren.

  16. Scrollen Sie nach unten zum Abschnitt Vorgänge, wählen Sie GetLastInvoice und dann Vorgang testen aus.

    Screenshot mit der Schaltfläche „Vorgang testen“

    Ihnen sollte ein 404-Fehler angezeigt werden, da die API keinen GetLastInvoice-Vorgang hat.

    Screenshot mit dem fehlgeschlagenen Vorgang

    Navigieren Sie nicht von dieser Seite weg.

Aufgabe: Dem Konnektor Code hinzufügen

In dieser Aufgabe fügen Sie den Code hinzu, der den GetLastInvoice-Vorgang ausführt.

  1. Wählen Sie die Registerkarte Code aus, und aktivieren Sie dann den Umschalter Code aktiviert.

    Screenshot mit dem Umschalter „Code aktivieren“

  2. Wählen Sie das Dropdownmenü Vorgänge aus, und klicken Sie dann auf den Vorgang GetLastInvoice.

    Screenshot mit dem ausgewählten Vorgang

  3. Fügen Sie den folgenden Code in das Feld Code ein, und wählen Sie dann die Registerkarte Testen aus.

    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 mit dem Code und der Registerkarte Testen

  4. Überprüfen Sie den Code. Der Code sollte folgende Logik enthalten:

    • Prüft, ob es sich um den Vorgang GetLastInvoice handelt, und leitet andernfalls die unveränderte Anfrage an die Netzwerk-API weiter

    • Verändert die Anforderung, um den Vorgang ListInvoice auf der Netzwerk-API zu verwenden

    • Ruft die Netzwerk-API mit SendAsync auf

    • Transformiert die Antwort so, dass sie nur ein einziges Invoice-Objekt enthält, die zuletzt erstellte Rechnung

  5. Wählen Sie die Registerkarte Testen aus, und klicken Sie dann auf Konnektor aktualisieren. Warten Sie dann darauf, dass die Aktualisierung abgeschlossen wurde.

  6. Scrollen Sie nach unten zum Abschnitt Vorgänge, wählen Sie GetLastInvoice und dann Vorgang testen aus.

    Screenshot der Aktion „Vorgang testen“

Sie erhalten eine Antwort, die die letzte Rechnung anzeigt.

Screenshot mit der Vorgangsantwort