Exercício: usar código personalizado
Neste exercício, você adicionará uma nova operação a um conector personalizado existente. Em seguida, você usará o código personalizado para implementar a operação e transformar a resposta.
Você modificará o conector personalizado Contoso Invoicing que tem uma operação ListInvoice, mas não tem uma operação LastInvoice. Como resultado, você adicionará a operação LastInvoice para recuperar a fatura mais recente que foi criada. A API de rede para Contoso Invoicing não dá suporte a essa operação; portanto, você usa o código personalizado em execução na operação LastInvoice para redirecionar a solicitação para ListInvoice na API e transformar a resposta para retornar apenas a última fatura criada.
Importante
Use um ambiente de teste com o Microsoft Dataverse provisionado. Se ainda não tiver um, acesse Plano de desenvolvedor do Microsoft Power Apps para se inscrever no plano de desenvolvedor.
Tarefa: preparar seu ambiente
Nesta tarefa, você importará uma solução para o seu ambiente.
Acesse Microsoft Power Automate e verifique se você está no ambiente certo.
Selecione Dados > Conectores personalizados no painel de navegação esquerdo.
Verifique se você já tem o conector personalizado de Contoso Invoicing em seu ambiente.
Se você já tiver o conector personalizado de Contoso Invoicing em seu ambiente, pule para a próxima tarefa deste exercício. Se você não tiver o conector personalizado, continue na etapa 5.
Selecione Soluções > Importar.
Selecione Procurar.
Selecione a solução ContosoInvoicingExtensions_1_0_0_0.zip localizada na pasta de recursos e selecione Abrir.
Selecione Avançar.
Selecione Importar e aguarde a conclusão da importação. Uma mensagem de êxito deve aparecer após a conclusão da importação.
Selecione Publicar Todas as Personalizações e aguarde o término da publicação. Não saia desta página.
Tarefa: criar a operação LastInvoice
Nesta tarefa, você criará uma nova operação no conector personalizado em Contoso Invoicing.
Selecione a solução Contoso Invoicing - Extensions que você importou. O componente de conector personalizado Contoso Invoicing - Extensions deve ser exibido.
Selecione o conector Contoso Invoicing - Extensions, em seguida, selecione Editar. Seu conector pode não ter Extensões no nome se você o criou de um exercício diferente, não há problema.
Selecione a guia Definição e selecione + Nova ação.
Vá para a seção Solicitação e selecione + Importar da amostra.
Na seção Verbo, selecione Get, cole
https://contosoinvoicingtest.azurewebsites.net/GetLastInvoice
na caixa URL e selecione Importar.Role até a seção Resposta e selecione + Adicionar resposta padrão.
Cole o seguinte JSON no campo Corpo e selecione 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" }
Selecione a guia Teste, selecione Atualizar conector e aguarde a conclusão da atualização.
Inicie uma nova janela ou guia do navegador e vá para Contoso Invoicing.
Selecione o link Chave de API.
Copie a chave de API.
Salve esSa chave em um bloco de notas.
Retorne ao conector, selecione a guia Teste e, em seguida, selecione + Nova conexão.
Cole a chave que você copiou no campo Chave de API e selecione Criar conexão.
Selecione Atualizarconexões.
Role para baixo até a seção Operações, selecione GetLastInvoice e Operação de teste.
Você deve receber um erro 404, pois a API não tem uma operação GetLastInvoice.
Não saia desta página.
Tarefa: adicionar código ao conector
Nesta tarefa, você adicionará o código que executa a operação GetLastInvoice.
Selecione a guia Código e ative o botão de alternância Código Habilitado.
Selecione o menu suspenso Operações e a operação GetLastInvoice.
Cole o código a seguir no campo Código e selecione a guia Testar.
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; } }
Examine o código. O código deve conter a seguinte lógica:
Verifica se é a operação GetLastInvoice e, caso não seja, encaminhará a solicitação não modificada para a API da rede
Altera a solicitação para usar a operação ListInvoice na API de rede
Chama a API de rede usando SendAsync
Transforma a resposta para incluir apenas um único objeto Fatura que foi a fatura criada mais recentemente
Selecione a guia Teste, selecione Atualizar conector e aguarde a conclusão da atualização.
Role para baixo até a seção Operações, selecione GetLastInvoice e Operação de teste.
Você receberá uma resposta mostrando a última fatura.