简介

已完成

通过自定义连接器,您可以为 Microsoft Power Platform 预构建连接器中不可用的服务实现连接器。 开发人员可以使用自定义代码来实现连接器操作的输入和输出的高级转换。

基本的自定义连接器定义定义了使用该连接器的制作者可以使用的触发器和操作。 当制作者使用应用或流中的操作时,将调用 API 的操作,传递自定义连接器定义中定义的请求有效负载。 来自服务的响应有效负载应与自定义连接器操作响应定义相匹配。 请求和响应有效负载不会发生转换。

策略模板

连接器操作定义可以通过应用自定义连接器策略模板来实现对服务的请求和响应的无代码基本转换。 例如,策略模板可以执行以下类型的转换:

  • 将请求或响应数据从对象转换为数组。

  • 将请求或响应数据从数组转换为对象。

  • 设置请求的主机 URL。

  • 设置请求 HTTP 标头值。

  • 在请求或响应中设置属性值。

  • 设置请求查询字符串参数。

您可以同时使用多个策略模板来转换请求和响应。 当您设置多个模板时,还需要编辑顺序以控制策略应用的顺序。

开发人员可以实现自定义代码,实现超越策略模板的功能。 事实上,当您实现自定义代码时,逻辑将完全控制请求和响应转换,包括调用底层服务上操作的任务。

实现自定义代码

要实现自定义代码,您需要创建一个名为脚本的类,该类必须继承自抽象基类 ScriptBaseScriptBase 类定义了一种抽象方法 ExecuteAsync,您需要在 Script 类中实现此方法才能在连接器中成功实现自定义代码。 ExecuteAsync 方法应能够完整实现底层服务的任何转换和调用。

以下示例显示了用于实现所需元素的类:

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

ExecuteAsync 方法必须能够完整实现底层服务的任何转换和调用。 在以下示例中,未调用底层服务,每个响应都将是一个对象,其中包含设置为“Hello World!”的 greeting 属性。

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

要调用底层服务,需要对 context 对象使用 SendAsync 方法。 以下 ExecAsync 方法不执行任何转换,而是将请求转发到底层服务,然后原封不动地返回响应。

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

自定义代码最常见的用途是在 SendAsync 方法调用之前转换请求。 或者,您可以在从 ExecuteAsync 方法返回之前转换来自 SendAsync 方法的响应。

为操作创建自定义代码

您可以为连接器启用自定义代码,然后上传包含该代码的有效 .cs 或 .csx 文件。 您只能为连接器提供一个 Script 类,并且它必须处理为连接器设置的操作。 为此,请检查 Context 对象中的 OperationId 以确定是要转换代码还是将代码转发到底层服务。 下面的示例展示了此步骤的操作。

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

在此示例中,除 CreateProduct 之外的任何操作都将在不进行转换的情况下转发。 这种方法可以确保,如果设置了意外操作来运行代码,它们会被转发而不是被转换。

您还可以通过将自定义代码设置为针对特定操作运行来控制自定义代码运行的操作。 默认情况下,启用代码后,所有操作都将运行自定义代码。 下图显示只有 AddInvoiceGetInvoice 将运行自定义代码。

如果在导出的连接器中搜索这些值,您会发现它们存储在 apiProperties.json 文件中。

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

确保您选择的运行自定义代码的操作与您对代码中条件检查的预期保持一致。 如果不一致,自定义代码通常无法运行或会遇到意外错误。 如果您的连接器遇到错误,请检查连接器定义和脚本代码是否期望处理相同的操作。

在本模块的其余部分中,您将详细了解如何创建可以使用自定义连接器实现的自定义代码转换。