Ejercicio: Usar el código personalizado
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.
Vaya a Microsoft Power Automate y asegúrese de estar en el entorno correcto.
Seleccione Datos > Conectores personalizados en el panel de navegación izquierdo.
Compruebe que ya tenga el conector personalizado Contoso Invoicing en el entorno.
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.
Seleccione Soluciones > Importar.
Seleccione Examinar.
Seleccione la solución ContosoInvoicingExtensions_1_0_0_0.zip, que se encuentra en la carpeta de recursos, y seleccione Abrir.
Seleccione Siguiente.
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.
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.
Seleccione la solución Contoso Invoicing - Extensions que ha importado. Debería ver el componente de conector personalizado Contoso Invoicing - Extensions.
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.
Seleccione la pestaña Definición y la acción + Nueva acción.
Vaya a la sección Solicitud y seleccione + Importar desde ejemplo.
En la sección Verbo, seleccione Get, pegue
https://contosoinvoicingtest.azurewebsites.net/GetLastInvoice
en el cuadro de la URL y seleccione Importar.Desplácese hacia abajo hasta la sección Respuesta y seleccione + Agregar respuesta predeterminada.
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" }
Seleccione la pestaña Prueba, seleccione Actualizar conector y espere a que finalice la actualización.
Abra una nueva ventana o pestaña del navegador y vaya a Contoso Invoicing.
Seleccione el vínculo de la Clave de API.
Copie la Clave de API.
Guarde esta clave en un bloc de notas.
Vuelva al conector, seleccione la pestaña Prueba y, a continuación, + Nueva conexión.
Pegue la clave que ha copiado en el campo Clave de API y, luego, seleccione Crear conexión.
Seleccione Actualizarconexiones.
Desplácese hacia abajo, hasta la sección Operaciones, seleccione GetLastInvoice y elija Probar operación.
Debería recibir un error 404, ya que la API no tiene una operación GetLastInvoice.
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.
Seleccione la pestaña Código y active la alternancia Código habilitado.
Seleccione el menú desplegable Operaciones y, luego, seleccione la operación GetLastInvoice.
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; } }
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
Seleccione la pestaña Prueba, seleccione Actualizar conector y espere a que finalice la actualización.
Desplácese hacia abajo, hasta la sección Operaciones, seleccione GetLastInvoice y elija Probar operación.
Obtendrá una respuesta que muestra la última factura.