Ejercicio: Usar el código personalizado

Completado

En este ejercicio, agregará una nueva operación en un conector personalizado ya existente. Luego, usará código personalizado para implementar la operación y transformar la respuesta.

Modificará el conector personalizado Contoso Invoicing, que contiene una operación ListInvoice, pero no tiene una operación LastInvoice. Como resultado, agregará la operación LastInvoice para recuperar la factura más reciente que se haya creado. La API de red para Contoso Invoicing no es compatible con esta operación, por lo que debe usar código personalizado que se ejecute en la operación LastInvoice para redirigir la solicitud a ListInvoice en la API y, luego, transformar la respuesta para devolver solo la última factura que se haya creado.

Importante

Utilice un entorno de prueba con Microsoft Dataverse aprovisionado. Si aún no tiene uno, vaya al Plan para desarrolladores de Microsoft Power Apps para registrarse en el plan de desarrollador.

Tarea: Preparar su entorno

En esta tarea, importará una solución a su entorno.

  1. Vaya a Microsoft Power Automate y asegúrese de estar en el entorno correcto.

  2. Seleccione Datos > Conectores personalizados en el panel de navegación izquierdo.

  3. Compruebe que ya tenga el conector personalizado Contoso Invoicing en el entorno.

    Captura de pantalla con el conector personalizado

  4. Si ya tiene el conector personalizado Contoso Invoicing en su entorno, pase a la siguiente tarea de este ejercicio. Si no tiene el conector personalizado, vaya al paso 5.

  5. Seleccione Soluciones > Importar.

  6. Seleccione Examinar.

  7. Seleccione la solución ContosoInvoicingExtensions_1_0_0_0.zip, que se encuentra en la carpeta de recursos, y seleccione Abrir.

  8. Seleccione Siguiente.

  9. Seleccione Importar y espere a que se complete la importación. Una vez que se complete la importación, debería recibir un mensaje para indicar que se ha realizado correctamente.

  10. Seleccione Publicar todas las personalizaciones y espere a que se complete la publicación. No se vaya de esta página.

Tarea: Crear la operación LastInvoice

En esta tarea, creará una nueva operación en el conector personalizado Contoso Invoicing.

  1. Seleccione la solución Contoso Invoicing - Extensions que ha importado. Debería ver el componente de conector personalizado Contoso Invoicing - Extensions.

  2. Seleccione el conector Contoso Invoicing - Extensions y elija Editar. Es posible que el conector no tenga Extensions en el nombre si lo ha creado a partir de un ejercicio diferente, pero eso no es un problema.

    Captura de pantalla del botón para editar soluciones

  3. Seleccione la pestaña Definición y la acción + Nueva acción.

    Captura de pantalla con el botón Nueva acción

  4. Vaya a la sección Solicitud y seleccione + Importar desde ejemplo.

    Captura de pantalla del botón Importar desde ejemplo

  5. En la sección Verbo, seleccione Get, pegue https://contosoinvoicingtest.azurewebsites.net/GetLastInvoice en el cuadro de la URL y seleccione Importar.

    Captura de pantalla con la solicitud de importación a partir del cuadro de diálogo de ejemplo

  6. Desplácese hacia abajo hasta la sección Respuesta y seleccione + Agregar respuesta predeterminada.

    Captura de pantalla con el botón Agregar respuesta predeterminada

  7. Pegue el siguiente JSON en el campo Cuerpo y luego seleccione Importar.

    {
      "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. Seleccione la pestaña Prueba, seleccione Actualizar conector y espere a que finalice la actualización.

    Captura de pantalla con el botón Actualizar conector

  9. Abra una nueva ventana o pestaña del navegador y vaya a Contoso Invoicing.

  10. Seleccione el vínculo de la Clave de API.

  11. Copie la Clave de API.

  12. Guarde esta clave en un bloc de notas.

  13. Vuelva al conector, seleccione la pestaña Prueba y, a continuación, + Nueva conexión.

    Captura de pantalla del botón para agregar una nueva conexión

  14. Pegue la clave que ha copiado en el campo Clave de API y, luego, seleccione Crear conexión.

  15. Seleccione Actualizarconexiones.

  16. Desplácese hacia abajo, hasta la sección Operaciones, seleccione GetLastInvoice y elija Probar operación.

    Captura de pantalla del botón Probar operación

    Debería recibir un error 404, ya que la API no tiene una operación GetLastInvoice.

    Captura de pantalla con el error en la operación

    No se vaya de esta página.

Tarea: Agregar código al conector

En esta tarea, agregará el código que lleva a cabo la operación GetLastInvoice.

  1. Seleccione la pestaña Código y active la alternancia Código habilitado.

    Captura de pantalla con el botón de alternancia para habilitar código

  2. Seleccione el menú desplegable Operaciones y, luego, seleccione la operación GetLastInvoice.

    Captura de pantalla con la operación seleccionada

  3. Pegue el siguiente código en el campo Código y seleccione la pestaña Probar.

    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;
        }
    }
    

    Captura de pantalla con el código y la pestaña Probar

  4. Revise el código. El código debería contener la siguiente lógica:

    • Comprueba si se trata de la operación GetLastInvoice; de no ser así, reenvía la solicitud sin modificar a la API de red

    • Cambia la solicitud para usar la operación ListInvoice en la API de red

    • Invoca la API de red mediante SendAsync

    • Transforma la respuesta para incluir solo un único objeto Factura, la factura creada más recientemente

  5. Seleccione la pestaña Prueba, seleccione Actualizar conector y espere a que finalice la actualización.

  6. Desplácese hacia abajo, hasta la sección Operaciones, seleccione GetLastInvoice y elija Probar operación.

    Captura de pantalla de la acción Probar operación

Obtendrá una respuesta que muestra la última factura.

Captura de pantalla con la respuesta de la operación