Exercício: usar código personalizado

Concluído

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.

  1. Acesse Microsoft Power Automate e verifique se você está no ambiente certo.

  2. Selecione Dados > Conectores personalizados no painel de navegação esquerdo.

  3. Verifique se você já tem o conector personalizado de Contoso Invoicing em seu ambiente.

    Captura de tela mostrando o conector personalizado.

  4. 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.

  5. Selecione Soluções > Importar.

  6. Selecione Procurar.

  7. Selecione a solução ContosoInvoicingExtensions_1_0_0_0.zip localizada na pasta de recursos e selecione Abrir.

  8. Selecione Avançar.

  9. Selecione Importar e aguarde a conclusão da importação. Uma mensagem de êxito deve aparecer após a conclusão da importação.

  10. 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.

  1. Selecione a solução Contoso Invoicing - Extensions que você importou. O componente de conector personalizado Contoso Invoicing - Extensions deve ser exibido.

  2. 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.

    Captura de tela do botão Editar solução.

  3. Selecione a guia Definição e selecione + Nova ação.

    Captura de tela mostrando o botão Criar nova ação.

  4. Vá para a seção Solicitação e selecione + Importar da amostra.

    Captura de tela mostrando a importação do botão de exemplo.

  5. Na seção Verbo, selecione Get, cole https://contosoinvoicingtest.azurewebsites.net/GetLastInvoice na caixa URL e selecione Importar.

    Captura de tela mostrando a solicitação de importação da caixa de diálogo de exemplo.

  6. Role até a seção Resposta e selecione + Adicionar resposta padrão.

    Captura de tela mostrando o botão Adicionar resposta padrão.

  7. 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"
    }
    
  8. Selecione a guia Teste, selecione Atualizar conector e aguarde a conclusão da atualização.

    Captura de tela mostrando o botão do conector de atualização.

  9. Inicie uma nova janela ou guia do navegador e vá para Contoso Invoicing.

  10. Selecione o link Chave de API.

  11. Copie a chave de API.

  12. Salve esSa chave em um bloco de notas.

  13. Retorne ao conector, selecione a guia Teste e, em seguida, selecione + Nova conexão.

    Captura de tela do botão Adicionar nova conexão.

  14. Cole a chave que você copiou no campo Chave de API e selecione Criar conexão.

  15. Selecione Atualizarconexões.

  16. Role para baixo até a seção Operações, selecione GetLastInvoice e Operação de teste.

    Captura de tela do botão de operação de teste.

    Você deve receber um erro 404, pois a API não tem uma operação GetLastInvoice.

    Captura de tela mostrando a operação com falha.

    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.

  1. Selecione a guia Código e ative o botão de alternância Código Habilitado.

    Captura de tela mostrando o botão de ativação Habilitar código.

  2. Selecione o menu suspenso Operações e a operação GetLastInvoice.

    Captura de tela mostrando a operação selecionada.

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

    Captura de tela mostrando o código e a guia de teste.

  4. 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

  5. Selecione a guia Teste, selecione Atualizar conector e aguarde a conclusão da atualização.

  6. Role para baixo até a seção Operações, selecione GetLastInvoice e Operação de teste.

    Captura de tela da ação de operação de teste.

Você receberá uma resposta mostrando a última fatura.

Captura de tela mostrando a resposta da operação.