Introducción

Completado

Gracias a los conectores personalizados, puede implementar conectores para servicios que no están disponibles en los conectores preconfigurados de Microsoft Power Platform. Los desarrolladores pueden usar código personalizado para implementar una transformación avanzada de la entrada y la salida de las acciones de un conector.

Una definición básica de conector personalizado establece los desencadenadores y las acciones disponibles para los creadores que usan el conector. Cuando un creador usa la acción de una aplicación o un flujo, se invoca la operación de la API pasando la carga de la solicitud establecida en la definición del conector personalizado. Se espera que la carga de respuesta del servicio coincida con la definición de respuesta de acción del conector personalizado. No hay ninguna transformación en la solicitud ni en la carga de respuesta.

Plantillas de directivas

Las definiciones de acción del conector pueden implementar una transformación básica sin código de la solicitud y la respuesta al servicio, aplicando para ello plantillas personalizadas de directivas de conectores. Por ejemplo, las plantillas de directivas pueden llevar a cabo los siguientes tipos de transformaciones:

  • Convertir datos de solicitud o respuesta de un objeto en una matriz.

  • Convertir datos de solicitud o respuesta de una matriz en un objeto.

  • Establecer la URL del host para la solicitud.

  • Establecer los valores del encabezado HTTP de la solicitud.

  • Establecer un valor de propiedad en la solicitud o la respuesta.

  • Establecer parámetros de cadena de consulta en la solicitud.

Puede usar varias plantillas de directivas juntas para transformar la solicitud y la respuesta. Cuando configure varias plantillas, también editará el orden, a fin de controlar la secuencia de la aplicación de la directiva.

Los desarrolladores pueden implementar código personalizado para superar la capacidad de las plantillas de directivas. De hecho, cuando implementa código personalizado, la lógica toma el control total sobre la transformación de la solicitud y la respuesta, lo que incluye la tarea de invocar la operación en el servicio subyacente.

Implementar código personalizado

Para implementar código personalizado, deberá crear una clase denominada Script, que debe heredar de la clase base abstracta ScriptBase. La clase ScriptBase define un método abstracto, ExecuteAsync, que deberá implementar en la clase Script a fin de implementar eficazmente código personalizado en un conector. El método ExecuteAsync debería ser la implementación completa de cualquier transformación e invocación del servicio subyacente.

El siguiente ejemplo muestra una clase que implementa los elementos necesarios:

public class Script : ScriptBase
{
    public override Task<HttpResponseMessage> ExecuteAsync()
    {
        // Your code here
    }
}

El método ExecuteAsync debe proporcionar la implementación completa de cualquier transformación e invocación del servicio subyacente. En el siguiente ejemplo, el servicio subyacente no se invoca, y cada respuesta sería un objeto que contiene una propiedad greeting establecida 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 el servicio subyacente, utilice el método SendAsync en el objeto context. El siguiente método ExecAsync no hace transformaciones, pero reenvía la solicitud al servicio subyacente y luego devuelve la respuesta intacta.

public override async Task<HttpResponseMessage> ExecuteAsync()
{
    HttpResponseMessage response = await this.Context.SendAsync(this.Context.Request, this.CancellationToken).ConfigureAwait(continueOnCapturedContext: false);
    return response;
}

El uso más común del código personalizado es proporcionar la transformación de la solicitud antes del método de llamada SendAsync. También puede transformar la respuesta desde el método SendAsync antes de regresar del método ExecuteAsync.

Crear código personalizado para operaciones

Puede habilitar el código personalizado para un conector y, luego, cargar un archivo .cs o .csx válido que contenga el código. Solo puede proporcionar una clase script para el conector, y debe controlar las acciones configuradas para el conector. Para hacerlo, revise OperationId desde el objeto Context para determinar si desea transformar o reenviar el código al servicio subyacente. En el siguiente ejemplo se muestra este paso en acción.

  if (this.Context.OperationId != "CreateProduct")
  {
     return await this.HandleForwardOperation().ConfigureAwait(false);
  } 

En este ejemplo, cualquier acción que no sea CreateProduct se reenviará sin transformación. Gracias a este método, nos aseguramos de que, si se configuran acciones inesperadas para ejecutar el código, estas se reenvíen en lugar de transformarse.

También puede controlar en qué operaciones se ejecuta el código personalizado; para ello, configúrelo de modo que se ejecute para operaciones específicas. De forma predeterminada, después de habilitar el código, todas las operaciones ejecutarán el código personalizado. La siguiente imagen muestra que solo AddInvoice y GetInvoice ejecutan el código personalizado.

Si busca estos valores en un conector exportado, los encontrará almacenados en el archivo apiProperties.json.

"scriptOperations": [
      "AddInvoice”,
      "GetInvoice”
    ],

Compruebe que la selección de operaciones que ejecutan el código personalizado coincida con las expectativas de las comprobaciones condicionales que tenga en su código. Si esto no está sincronizado, es común que el código personalizado no se ejecute o que haya errores inesperados. Si su conector ha encontrado errores, compruebe que la definición del conector y el código de script cuenten con que se vayan a procesar las mismas operaciones.

En el resto del módulo, descubrirá más cosas sobre cómo crear transformaciones de código personalizadas que puede implementar con los conectores personalizados.