使用解决方案文件创建自定义 API

注意

这是一个高级主题,假定你已阅读并理解以下主题:

本文演示如何通过将定义文件添加到Microsoft Dataverse解决方案项目来创建自定义 API。 此方法适用于将 解决方案文件存储在源代码管理中的解决方案 发布者并应用应用程序生命周期管理(ALM)做法的解决方案发布者。

使用 Microsoft Power Platform CLI 初始化解决方案项目、生成解决方案包并将其导入 Dataverse 环境。 无需先创建或导出空解决方案。

先决条件

步骤 1:初始化解决方案项目

从要在其中创建项目的文件夹运行以下命令:

pac solution init --publisher-name Samples --publisher-prefix sample --outputDirectory CustomAPIExample

pac solution init 命令创建一个CustomAPIExample包含:

  • CustomAPIExample.cdsproj:Dataverse 解决方案项目文件。
  • src\Other\Solution.xml:解决方案和发布者定义。
  • src\Other\Customizations.xml:解决方案自定义定义。
  • src\Other\Relationships.xml:解决方案关系定义。

输出目录名称将成为解决方案唯一名称。 在继续之前验证 src\Other\Solution.xml 生成的值。

注意

发布者名称和自定义前缀必须满足 pac 解决方案 init 中所述的要求。 在目标环境中或要创建的新发布者使用现有发布服务器的值。

步骤 2:添加自定义 API 的定义

解决方案中的所有自定义 API 都位于名为 customapis 的文件夹内。 在该文件夹中,每个自定义 API 都位于一个名为自定义 API UniqueName 属性的文件夹中。 表示自定义 API 的数据位于名为 的 XML 文件中。

  1. 在文件夹中,创建一个名为 > 的新文件夹。

  2. customapis 文件夹中,使用 UniqueName 要创建的自定义 API 创建文件夹。 在本示例中,我们使用 sample_CustomAPIExample

  3. 在创建的 sample_CustomAPIExample 文件夹中,创建一个名为 . customapi.xml.

  4. customapi.xml编辑以设置要创建的自定义 API 的属性。 对于此示例,请使用以下 XML:

    <customapi uniquename="sample_CustomAPIExample">
      <allowedcustomprocessingsteptype>0</allowedcustomprocessingsteptype>
      <bindingtype>0</bindingtype>
      <boundentitylogicalname />
      <description default="A simple example of a custom API">
        <label description="A simple example of a custom API" languagecode="1033" />
      </description>
      <displayname default="Custom API Example">
        <label description="Custom API Example" languagecode="1033" />
      </displayname>
      <iscustomizable>0</iscustomizable>
      <executeprivilegename />
      <isfunction>0</isfunction>
      <isprivate>0</isprivate>
      <name>sample_CustomAPIExample</name>
      <plugintypeid />
    </customapi>
    

    请参阅 自定义 API 表列中 的信息以设置元素的值。

设置插件类型的关系(可选)

如果已有要与此自定义 API 关联的插件类型,请在此定义中添加以下元素 <customapi> 来包含对此定义的引用:

<plugintypeid>
  <plugintypeexportkey>{Add the GUID value of the plug-in type export key}</plugintypeexportkey>
</plugintypeid>

<plugintypeid>
  <plugintypeid>{Add the GUID value of the plug-in type ID}</plugintypeid>
</plugintypeid>

注意

任一值都将正常工作,但建议使用 plugintypeexportkey

若要检索 PluginTypeExportKeyPluginTypeId 值,请在知道插件类型的名称时使用 Web API 查询:

GET [Organization Uri]/api/data/v9.2/plugintypes?$select=name,plugintypeid,plugintypeexportkey&$filter=contains(name,'MyPlugin.TypeName')

步骤 3:添加任何自定义 API 请求参数

在名为 <a0/> 的文件夹中包含自定义 API 的请求参数的定义。 在该文件夹中,每个自定义 API 请求参数都位于一个名为其 UniqueName 属性的文件夹中。

  1. 如果自定义 API 具有任何请求参数,请在该文件夹中创建名为 <a0/> 的文件夹。

  2. 对于每个自定义 API 请求参数,请使用 UniqueName 自定义 API 请求参数的属性创建新文件夹。 在本示例中,我们使用 StringParameter

  3. 在该文件夹中,添加一个名为 customapirequestparameter.xml..

  4. 编辑 customapirequestparameter.xml 文件以设置要创建的自定义 API 的属性。 对于此示例,我们使用以下内容:

    <customapirequestparameter uniquename="StringParameter">
      <description default="The StringParameter request parameter for custom API Example">
        <label description="The StringParameter request parameter for custom API Example" languagecode="1033" />
      </description>
      <displayname default="Custom API Example String Parameter">
        <label description="Custom API Example String Parameter" languagecode="1033" />
      </displayname>
      <iscustomizable>0</iscustomizable>
      <isoptional>0</isoptional>
      <logicalentityname />
      <name>sample_CustomAPIExample.StringParameter</name>
      <type>10</type>
    </customapirequestparameter>
    

    请参阅 自定义 API 请求参数表列 来设置元素的值。

步骤 4:添加任何自定义 API 响应属性

在名为 <a0/a0> 的文件夹中定义自定义 API 的响应属性。 每个自定义 API 响应属性都驻留在其自己的文件夹中,该文件夹以属性 UniqueName 的值命名。

  1. 如果自定义 API 包含响应属性,请在其中CustomAPIExample\src\customapis\sample_CustomAPIExample创建一个customapiresponseproperties文件夹。

  2. 对于每个自定义 API 响应属性,请使用 UniqueName 自定义 API 响应属性的属性创建新文件夹。 在本示例中,我们使用 StringProperty

  3. 添加一 customapiresponseproperty.xml 个名为文件夹的 XML 文件。

  4. 编辑 customapiresponseproperty.xml 文件以设置要创建的自定义 API 的属性。 对于此示例,我们使用以下内容:

    <customapiresponseproperty uniquename="StringProperty">
      <description default="The StringProperty response property for custom API Example">
        <label description="The StringProperty response property for custom API Example" languagecode="1033" />
      </description>
      <displayname default="Custom API Example String Property">
        <label description="Custom API Example String Property" languagecode="1033" />
      </displayname>
      <iscustomizable>0</iscustomizable>
      <logicalentityname />
      <name>sample_CustomAPIExample.StringProperty</name>
      <type>10</type>
    </customapiresponseproperty>
    

    若要设置元素的值,请参阅 自定义 API 响应属性表列

注意

虽然请求参数和响应属性的架构非常相似,但请注意 isoptional ,对于响应属性无效,在尝试导入解决方案时会导致错误。

步骤 5:查看解决方案项目结构

解决方案项目应具有以下结构:

CustomAPIExample
|   CustomAPIExample.cdsproj
|
\---src
    +---customapis
    |   \---sample_CustomAPIExample
    |       |   customapi.xml
    |       |
    |       +---customapirequestparameters
    |       |   \---StringParameter
    |       |           customapirequestparameter.xml
    |       |
    |       \---customapiresponseproperties
    |           \---StringProperty
    |                   customapiresponseproperty.xml
    |
    \---Other
            Customizations.xml
            Relationships.xml
            Solution.xml

步骤 6:生成解决方案

CustomAPIExample在项目文件夹中,运行:

dotnet build

生成过程将还原所需的包,并在以下位置 bin\Debug\CustomAPIExample.zip创建非托管解决方案包。

步骤 7:导入解决方案

重要

需要对 Dataverse 环境进行经过身份验证的 PAC CLI 会话。

如果已有身份验证配置文件,请使用 pac 身份验证列表和 pac 身份验证选择 来选择目标环境的配置文件。

如果没有任何身份验证配置文件, 请了解如何连接到环境

  1. CustomAPIExample从项目文件夹中导入并发布解决方案:

    pac solution import --path .\bin\Debug\CustomAPIExample.zip --publish-changes
    

等待导入完成。

注意

如果同时安装另一个解决方案,则可能会出现错误。 有关详细信息,请参阅 并发解决方案操作失败。 解决方法通常是稍后重试。

步骤 8:验证是否已将自定义 API 添加到解决方案

Power Apps中,打开 CustomAPIExample 解决方案,并验证是否包含自定义 API 以及关联的请求参数和响应属性。

显示已成功安装解决方案组件。

此时,可以使用 测试自定义 API 中所述的步骤测试 API。 此时,可以使用 测试自定义 API 中所述的步骤测试 API。

更新解决方案中的自定义 API

寄送包含自定义 API 的解决方案后,可能需要对非托管解决方案中的自定义 API 进行一些更改。 可以添加新的参数或响应属性,并更改支持更新的列,例如 displaynamedescription

在生成和导入更新的解决方案之前,请将修订设置为大于已安装的版本的值。 例如,从解决方案项目文件夹运行以下命令:

pac solution version --revisionversion 2 --solutionPath .\src
dotnet build
pac solution import --path .\bin\Debug\CustomAPIExample.zip --publish-changes

重要

不能在解决方案中引入对自定义 API 的更改,该 API 修改保存后无法更改的任何属性。 安装包含自定义 API 定义的解决方案的较新版本时,它将尝试更新自定义 API、自定义 API 请求参数和自定义 API 响应属性。 解决方案更新与尝试使用任何其他方法更新自定义 API 相同。

以下是创建自定义 API 后无法更改的解决方案文件中的属性:

  • 自定义 API 属性:
    • allowedcustomprocessingsteptype
    • bindingtype
    • boundentitylogicalname
    • isfunction
    • uniquename
    • workflowsdkstepenabled
  • 自定义 API 请求参数属性:
    • isoptional
    • logicalentityname
    • type
    • uniquename
  • 自定义 API 响应属性属性:
    • logicalentityname
    • type
    • uniquename

有关详细信息,请参阅 CustomAPI 表。 有关详细信息,请参阅 CustomAPI 表

使用解决方案提供本地化标签

可以直接在自定义 API 实体的解决方案文件中提供翻译,而不是使用 本地化标签值中所述的过程。 例如,如果要为自定义 API 提供日语本地化标签,则可以为 description 自定义 API 提供它们和 displayname 属性,如以下示例所示:

<customapi uniquename="sample_CustomAPIExample">
  <allowedcustomprocessingsteptype>0</allowedcustomprocessingsteptype>
  <bindingtype>0</bindingtype>
  <description default="A simple example of a custom API">
    <label description="A simple example of a custom API" languagecode="1033" />
    <label description="カスタムAPIの簡単な例" languagecode="1041" />
  </description>
  <displayname default="Custom API Example">
    <label description="Custom API Example" languagecode="1033" />
    <label description="カスタムAPIの例" languagecode="1041" />
  </displayname>
  <iscustomizable>0</iscustomizable>
  <isfunction>0</isfunction>
  <name>sample_CustomAPIExample</name>
</customapi>

另见