Introdução
Os conectores personalizados permitem que você implemente um conector para serviços que não estão disponíveis nos conectores predefinidos do Microsoft Power Platform. Os desenvolvedores podem usar código personalizado para implementar a transformação avançada da entrada e saída das ações de um conector.
Uma definição básica de conector personalizado define os gatilhos e ações que estão disponíveis para fabricantes que usam o conector. Quando um criador usa a ação de um aplicativo ou fluxo, a operação da API é invocada passando a carga útil da solicitação definida na definição do conector personalizado. Espera-se que a carga de resposta do serviço corresponda à definição de resposta de ação do conector personalizado. Nenhuma transformação ocorre na carga de solicitação e resposta.
Modelos de política
As definições de ação do conector podem implementar uma transformação básica sem código da solicitação e resposta ao serviço, aplicando modelos de política de conector personalizados. Por exemplo, os modelos de política podem executar os seguintes tipos de transformações:
Converter dados de solicitação ou resposta de um objeto em uma matriz.
Converter dados de solicitação ou resposta de uma matriz em um objeto.
Definir a URL do host para a solicitação.
Definir os valores do cabeçalho HTTP da solicitação.
Definir um valor de propriedade na solicitação ou resposta.
Definir os parâmetros da cadeia de caracteres de consulta da solicitação.
Você pode usar vários modelos de política juntos para transformar a solicitação e a resposta. Ao configurar vários modelos, você também editará a ordem para controlar a sequência do aplicativo de política.
Os desenvolvedores podem implementar código personalizado para ir além do que os modelos de política são capazes de fazer. Na verdade, quando você implementa o código personalizado, a lógica assume o controle total sobre a transformação de solicitação e resposta, inclusive a tarefa de invocar a operação no serviço subjacente.
Implemente o código personalizado
Para implementar o código personalizado, você precisará criar uma classe chamada Script, que deve herdar da classe base abstrata ScriptBase. A classe ScriptBase define um método abstrato, ExecuteAsync, que você precisa implementar na classe Script para implementar com êxito o código personalizado em um conector. Espera-se que o método ExecuteAsync seja a implementação completa de qualquer transformação e invocação do serviço subjacente.
O exemplo a seguir mostra uma classe que implementa os elementos necessários:
public class Script : ScriptBase
{
public override Task<HttpResponseMessage> ExecuteAsync()
{
// Your code here
}
}
O método ExecuteAsync deve fornecer a implementação completa de qualquer transformação e invocação do serviço subjacente. No exemplo a seguir, o serviço subjacente não é invocado e cada resposta seria um objeto que continha uma propriedade greeting definida como "Hello World!"
public override async Task<HttpResponseMessage> ExecuteAsync()
{
// Create a new response
var response = new HttpResponseMessage();
// Set the content
// Initialize a new JObject and call .ToString() to get the serialized JSON
response.Content = CreateJsonContent(new JObject
{
["greeting"] = "Hello World!",
}.ToString());
return response;
}
Para invocar o serviço subjacente, você usará o método SendAsync no objeto context. O método ExecAsync a seguir não executa nenhuma transformação, mas encaminha a solicitação para o serviço subjacente e retorna a resposta intacta.
public override async Task<HttpResponseMessage> ExecuteAsync()
{
HttpResponseMessage response = await this.Context.SendAsync(this.Context.Request, this.CancellationToken).ConfigureAwait(continueOnCapturedContext: false);
return response;
}
O uso mais comum do código personalizado é fornecer a transformação da solicitação antes da chamada do método SendAsync. Como alternativa, você pode transformar a resposta do método SendAsync antes de retornar do método ExecuteAsync.
Criar código personalizado para operações
Você pode habilitar o código personalizado para um conector e carregar um arquivo.cs ou.csx válido que contenha o código. Você pode fornecer apenas uma classe de script para o conector, e ela deve lidar com as ações configuradas para o conector. Para isso, verifique o OperationId do objeto Context para determinar se deseja transformar ou encaminhar o código para o serviço subjacente. O exemplo a seguir mostra essa etapa em ação.
if (this.Context.OperationId != "CreateProduct")
{
return await this.HandleForwardOperation().ConfigureAwait(false);
}
Neste exemplo, qualquer ação diferente de CreateProduct seria encaminhada sem transformação. Essa abordagem garante que, se ações inesperadas forem configuradas para executar o código, elas sejam encaminhadas e não transformadas.
Você também pode controlar em quais operações o código personalizado é executado, definindo-o para ser executado em operações específicas. Por padrão, após a habilitação do código, todas as operações executarão o código personalizado. A imagem a seguir mostra que apenas AddInvoice e GetInvoice executam o código personalizado.
Se estiver procurando por esses valores em um conector exportado, você os encontrará armazenados no arquivo apiProperties.json.
"scriptOperations": [
"AddInvoice”,
"GetInvoice”
],
Verifique se sua seleção de operações que executam o código personalizado corresponda às expectativas de verificações condicionais que você tem em seu código. Se estiverem fora de sincronia, é comum que o código personalizado não seja executado ou encontre erros inesperados. Se o conector encontrou erros, verifique se a definição do conector e o código do script esperam que as mesmas operações sejam processadas.
No restante do módulo, você explorará mais sobre como criar transformações de código personalizadas que podem ser implementadas com seus conectores personalizados.