使用Azure 数据工厂从/向 REST 终结点复制和转换数据

适用于: Azure 数据工厂 Azure Synapse Analytics

本文概述了如何使用Azure 数据工厂中的复制活动从/向 REST 终结点复制数据。 本文基于 Azure 数据工厂 中的Copy Activity,并概述了复制活动。

该 REST 连接器、 HTTP 连接器Web 表连接器 之间的区别有:

  • REST connector 连接器专门支持从 RESTful API 复制数据。
  • HTTP 连接器 是通用的,用于从任意 HTTP 端点获取数据,例如下载文件。 在这个 REST 连接器之前,你可能会用 HTTP 连接器来复制 RESTful API 的数据,虽然支持但功能不如 REST 连接器。
  • Web 表连接器用于从 HTML 网页中提取表内容。

支持的功能

此 REST 连接器支持以下功能:

支持的功能 IR
复制活动 (源/接收器) (1) (2)
映射数据流(源/汇) (1)

(1) Azure集成运行时 (2) 自承载集成运行时

如需可以用作源/接收器的数据存储的列表,请参阅支持的数据存储

具体而言,此泛型 REST 连接器支持:

  • 使用GETPOST方法从REST端点复制数据,使用POST、PUTPATCH方法将数据复制到REST端点。
  • 通过以下认证之一复制数据: 匿名认证、 Basic认证、 服务主体认证、 OAuth2客户端凭证系统分配托管身份用户指定托管身份
  • REST API 中的分页
  • 对于作为源的 REST,按原样复制 REST JSON 响应,或使用架构映射对其进行分析。 仅支持 JSON 格式的响应有效负载。

提示

若要在数据工厂中配置 REST 连接器之前测试数据检索请求,请了解标头和正文的 API 规范要求。 可以使用Visual Studio、PowerShell 的 Invoke-RestMethod 或 Web 浏览器等工具来验证。

先决条件

如果数据存储位于本地网络、Azure虚拟网络或 Amazon 虚拟私有云中,则需要配置自承载集成运行时以连接到它。

如果数据存储是托管的云数据服务,则可以使用Azure Integration Runtime。 如果访问仅限于防火墙规则中批准的 IP,则可以将 Azure Integration Runtime IP 添加到允许列表。

还可以在 Azure 数据工厂 中使用 托管虚拟网络集成运行时功能访问本地网络,而无需安装和配置自承载集成运行时。

要详细了解网络安全机制和数据工厂支持的选项,请参阅数据访问策略

开始

若要使用管道执行复制活动,可以使用以下工具或 SDK 之一:

使用 UI 创建 REST 链接服务

使用以下步骤在Azure门户 UI 中创建 REST 链接服务。

  1. 浏览到Azure 数据工厂或 Synapse 工作区中的“管理”选项卡,然后选择“链接服务”,然后选择“新建”

  2. 搜索“REST”并选择 REST 连接器。

    选择 REST 连接器的截图。

  3. 配置服务详细信息、测试连接并创建新的链接服务。

    配置REST链接服务的截图。

连接器配置详细信息

对于特定于 REST 连接器的数据工厂实体,以下部分提供了有关用于定义这些实体的属性的详细信息。

连接的服务属性

REST 链接服务支持以下属性:

属性 描述 必需
类型 type 属性必须设置为 RestService
网址 REST 服务的基础 URL。
启用服务器证书验证 连接到终结点时是否要验证服务器端 TLS/SSL 证书。
(默认值为 true
验证类型 用于连接到 REST 服务的身份验证类型。 允许的值为 AnonymousBasicAadServicePrincipalOAuth2ClientCredentialManagedServiceIdentity。 此外,还可以在 authHeaders 属性中配置身份验证标头。 有关其他属性和示例,请参阅下面的相应部分。
authHeaders 用于身份验证的其他 HTTP 请求标头。
例如,若要使用 API 密钥身份验证,可以将身份验证类型选为“匿名”,然后在标头中指定 API 密钥。
连接方式 用于连接到数据存储的 Integration Runtime。 从先决条件部分了解更多信息。 如果未指定,此属性将使用默认Azure Integration Runtime。

有关不同的身份验证类型,请参阅相应的部分了解详细信息。

使用基本身份验证

authenticationType 属性设置为 Basic。 除了前面部分所述的通用属性,还指定以下属性:

属性 描述 必需
用户名 用于访问 REST 终结点的用户名。
密码 用户(userName 值)的密码。 将此字段标记为 SecureString 类型,以便安全地将其存储在数据工厂中。 还可以引用存储在 Azure 密钥保管库 中的机密。

示例

{
    "name": "RESTLinkedService",
    "properties": {
        "type": "RestService",
        "typeProperties": {
            "authenticationType": "Basic",
            "url" : "<REST endpoint>",
            "userName": "<user name>",
            "password": {
                "type": "SecureString",
                "value": "<password>"
            }
        },
        "connectVia": {
            "referenceName": "<name of Integration Runtime>",
            "type": "IntegrationRuntimeReference"
        }
    }
}

使用服务主体身份验证

authenticationType 属性设置为 AadServicePrincipal。 除了前面部分所述的通用属性,还指定以下属性:

属性 描述 必需
服务主体标识符 指定Microsoft Entra应用程序的客户端 ID。
服务主体凭证类型 指定要用于服务主体身份验证的凭据类型。 允许的值为 ServicePrincipalKeyServicePrincipalCert
适用于 ServicePrincipalKey
服务主体密钥 指定Microsoft Entra应用程序的密钥。 将此字段标记为 SecureString 以安全地将其存储在数据工厂中,或引用存储在 Azure 密钥保管库 中的机密。
适用于 ServicePrincipalCert
服务主体嵌入式证书 指定在 Microsoft Entra ID 中注册的应用程序的 base64 编码证书,并确保证书内容类型PKCS #12。 将此字段标记为 SecureString 以安全地存储该字段,或引用存储在 Azure 密钥保管库 中的机密。 转到此 section 了解如何在Azure 密钥保管库中保存证书。
servicePrincipalEmbeddedCertPassword(服务主体嵌入式证书密码) 如果使用密码保护证书,请指定证书的密码。 将此字段标记为 SecureString 以安全地存储该字段,或引用存储在 Azure 密钥保管库 中的机密。
租户 请指定您的应用程序所归属的租户信息(域名或租户 ID)。 通过将鼠标悬停在Azure门户右上角来检索它。
aadResourceId 指定要请求授权的Microsoft Entra资源,例如https://management.core.chinacloudapi.cn
Azure云类型 对于服务主体身份验证,请指定注册Microsoft Entra应用程序的Azure云环境的类型。
允许的值为“AzureChina”。 默认情况下,使用数据工厂的云环境。

示例 1:使用服务主体密钥身份验证

{
    "name": "RESTLinkedService",
    "properties": {
        "type": "RestService",
        "typeProperties": {
            "url": "<REST endpoint e.g. https://www.example.com/>",
            "authenticationType": "AadServicePrincipal",
            "servicePrincipalId": "<service principal id>",
            "servicePrincipalCredentialType": "ServicePrincipalKey",
            "servicePrincipalKey": {
                "value": "<service principal key>",
                "type": "SecureString"
            },
            "tenant": "<tenant info, e.g. microsoft.partner.onmschina.cn>",
            "aadResourceId": "<Azure AD resource URL e.g. https://management.core.chinacloudapi.cn>"
        },
        "connectVia": {
            "referenceName": "<name of Integration Runtime>",
            "type": "IntegrationRuntimeReference"
        }
    }
}

示例 2:使用服务主体证书身份验证

{
    "name": "RESTLinkedService",
    "properties": {
        "type": "RestService",
        "typeProperties": {
            "url": "<REST endpoint e.g. https://www.example.com/>",
            "authenticationType": "AadServicePrincipal",
            "servicePrincipalId": "<service principal id>",
            "servicePrincipalCredentialType": "ServicePrincipalCert",
            "servicePrincipalEmbeddedCert": {
                "type": "SecureString",
                "value": "<the base64 encoded certificate of your application registered in Microsoft Entra ID>"
            },
            "servicePrincipalEmbeddedCertPassword": {
                "type": "SecureString",
                "value": "<password of your certificate>"
            },
            "tenant": "<tenant info, e.g. microsoft.partner.onmschina.cn>",
            "aadResourceId": "<Azure AD resource URL e.g. https://management.core.chinacloudapi.cn>"
        },
        "connectVia": {
            "referenceName": "<name of Integration Runtime>",
            "type": "IntegrationRuntimeReference"
        }
    }
}

将服务主体证书保存在 Azure 密钥保管库

可以使用两个选项在 Azure 密钥保管库 中保存服务主体证书:

  • 选项 1

    1. 将服务主体证书转换为 base64 字符串。 有关详细信息,请参阅本文

    2. 将 base64 字符串另存为Azure 密钥保管库中的机密。

      Azure 密钥保管库 中秘密列表的截图。

      机密值的屏幕截图。

  • 方法 2

    如果无法从 Azure 密钥保管库 下载证书,则可以使用此 template 将转换的服务主体证书保存为Azure 密钥保管库中的机密。

    用于将服务主体证书作为密钥保存到 AKV 的模板管道的屏幕截图。

使用 OAuth2 客户端凭证认证

authenticationType 属性设置为 OAuth2ClientCredential。 除了前面部分所述的通用属性,还指定以下属性:

属性 描述 必需
tokenEndpoint 用于获取访问令牌的授权服务器的令牌终结点。
客户端 ID 与应用程序关联的客户端 ID。
客户密钥 与应用程序关联的客户端密码。 将此字段标记为 SecureString 类型,以便安全地将其存储在数据工厂中。 还可以引用存储在 Azure 密钥保管库 中的机密。
作用域 所需的访问范围。 它描述将请求哪种类型的访问。
资源 将请求访问的目标服务或资源。

示例

{
    "name": "RESTLinkedService",
    "properties": {
        "type": "RestService",
        "typeProperties": {
            "url": "<REST endpoint e.g. https://www.example.com/>",
            "enableServerCertificateValidation": true,
            "authenticationType": "OAuth2ClientCredential",
            "clientId": "<client ID>",
            "clientSecret": {
                "type": "SecureString",
                "value": "<client secret>"
            },
            "tokenEndpoint": "<token endpoint>",
            "scope": "<scope>",
            "resource": "<resource>"
        }
    }
}

使用系统分配的托管标识身份验证

authenticationType 属性设置为 ManagedServiceIdentity。 除了前面部分所述的通用属性,还指定以下属性:

属性 描述 必需
aadResourceId 指定要请求授权的Microsoft Entra资源,例如https://management.core.chinacloudapi.cn

示例

{
    "name": "RESTLinkedService",
    "properties": {
        "type": "RestService",
        "typeProperties": {
            "url": "<REST endpoint e.g. https://www.example.com/>",
            "authenticationType": "ManagedServiceIdentity",
            "aadResourceId": "<AAD resource URL e.g. https://management.core.windows.net>"
        },
        "connectVia": {
            "referenceName": "<name of Integration Runtime>",
            "type": "IntegrationRuntimeReference"
        }
    }
}

使用用户分配的托管身份身份验证

authenticationType 属性设置为 ManagedServiceIdentity。 除了前面部分所述的通用属性,还指定以下属性:

属性 描述 必需
aadResourceId 指定要请求授权的Microsoft Entra资源,例如https://management.core.chinacloudapi.cn
凭据 将用户分配的托管标识指定为凭据对象。

示例

{
    "name": "RESTLinkedService",
    "properties": {
        "type": "RestService",
        "typeProperties": {
            "url": "<REST endpoint e.g. https://www.example.com/>",
            "authenticationType": "ManagedServiceIdentity",
            "aadResourceId": "<Azure AD resource URL e.g. https://management.core.chinacloudapi.cn>",
            "credential": {
                "referenceName": "credential1",
                "type": "CredentialReference"
            }    
        },
        "connectVia": {
            "referenceName": "<name of Integration Runtime>",
            "type": "IntegrationRuntimeReference"
        }
    }
}

使用身份验证标头

此外,还可以配置身份验证请求标头,以及内置的身份验证类型。

示例:使用 API 密钥身份验证

{
    "name": "RESTLinkedService",
    "properties": {
        "type": "RestService",
        "typeProperties": {
            "url": "<REST endpoint>",
            "authenticationType": "Anonymous",
            "authHeaders": {
                "x-api-key": {
                    "type": "SecureString",
                    "value": "<API key>"
                }
            }
        },
        "connectVia": {
            "referenceName": "<name of Integration Runtime>",
            "type": "IntegrationRuntimeReference"
        }
    }
}

数据集属性

本部分提供 REST 数据集支持的属性列表。

有关可用于定义数据集的各部分和属性的完整列表,请参阅数据集和链接服务

若要从 REST 复制数据,支持以下属性:

属性 描述 必需
类型 数据集的 type 属性必须设置为 RestResource
relativeUrl 包含数据的资源的相对 URL。 未指定此属性时,仅使用链接服务定义中指定的 URL。 HTTP 连接器从以下组合 URL 复制数据:[URL specified in linked service]/[relative URL specified in dataset]

如果你在数据集中设置 requestMethodadditionalHeadersrequestBodypaginationRules 复制操作仍然支持它们 as-is,尽管你今后应在活动中使用新模型。

示例:

{
    "name": "RESTDataset",
    "properties": {
        "type": "RestResource",
        "typeProperties": {
            "relativeUrl": "<relative url>"
        },
        "schema": [],
        "linkedServiceName": {
            "referenceName": "<REST linked service name>",
            "type": "LinkedServiceReference"
        }
    }
}

复制活动属性

本部分提供了 REST 源和接收器支持的属性列表。

有关可用于定义活动的各个部分和属性的完整列表,请参阅管道

REST 作为源

复制活动source部分支持以下属性:

属性 描述 必需
类型 复制活动源的 type 属性必须设置为 RestSource
请求方法 HTTP 方法。 允许的值为 GET(默认值)和 POST
附加头信息 其他 HTTP 请求标头。
请求主体 HTTP 请求的正文。
分页规则 用于撰写下一页请求的分页规则。 有关详细信息,请参阅分页支持部分。
httpRequestTimeout 用于获取响应的 HTTP 请求的超时 (TimeSpan 值)。 该值是用于获取回应的超时时间,而不是读取回应数据的超时时间。 默认值为 00:01:40
请求间隔 发送下一页请求之前等待的时间。 默认值为 00:00:01

注意

REST 连接器会忽略你在 . 中指定Accept的任何additionalHeaders头部。 因为它只支持 JSON 响应,会自动将 头设置为 Accept: application/json
顶级结构是 JSON 数组的 REST API 响应不支持分页。

示例 1:对分页使用 Get 方法

"activities":[
    {
        "name": "CopyFromREST",
        "type": "Copy",
        "inputs": [
            {
                "referenceName": "<REST input dataset name>",
                "type": "DatasetReference"
            }
        ],
        "outputs": [
            {
                "referenceName": "<output dataset name>",
                "type": "DatasetReference"
            }
        ],
        "typeProperties": {
            "source": {
                "type": "RestSource",
                "additionalHeaders": {
                    "x-user-defined": "helloworld"
                },
                "paginationRules": {
                    "AbsoluteUrl": "$.paging.next"
                },
                "httpRequestTimeout": "00:01:00"
            },
            "sink": {
                "type": "<sink type>"
            }
        }
    }
]

示例 2:使用 Post 方法

"activities":[
    {
        "name": "CopyFromREST",
        "type": "Copy",
        "inputs": [
            {
                "referenceName": "<REST input dataset name>",
                "type": "DatasetReference"
            }
        ],
        "outputs": [
            {
                "referenceName": "<output dataset name>",
                "type": "DatasetReference"
            }
        ],
        "typeProperties": {
            "source": {
                "type": "RestSource",
                "requestMethod": "Post",
                "requestBody": "<body for POST REST request>",
                "httpRequestTimeout": "00:01:00"
            },
            "sink": {
                "type": "<sink type>"
            }
        }
    }
]

REST 作为接收器

复制活动接收器部分中支持以下属性:

属性 描述 必需
类型 复制活动接收器的 type 属性必须设置为 RestSink
请求方法 HTTP 方法。 允许的值为 POST(默认值)、PUTPATCH
附加头信息 其他 HTTP 请求标头。
httpRequestTimeout 用于获取响应的 HTTP 请求的超时 (TimeSpan 值)。 此值是获取响应的超时,而不是写入数据的超时。 默认值为 00:01:40
请求间隔 不同请求之间的间隔时间(以毫秒为单位)。 请求时间间隔值应当为 [10, 60000] 范围中的数字。
HTTP压缩类型 (httpCompressionType) 使用最佳压缩级别发送数据时要使用的 HTTP 压缩类型。 允许的值为 nonegzip
writeBatchSize 每批写入 REST 接收端的记录数。 默认值为 10000。

REST 连接器作为接收器时适用于接受 JSON 的 REST API。 数据以 JSON 格式发送,模式如下。 如有需要,使用复制活动 模式映射 将源数据重塑,使其符合 REST API 预期的有效载荷。

[
    { <data object> },
    { <data object> },
    ...
]

示例:

"activities":[
    {
        "name": "CopyToREST",
        "type": "Copy",
        "inputs": [
            {
                "referenceName": "<input dataset name>",
                "type": "DatasetReference"
            }
        ],
        "outputs": [
            {
                "referenceName": "<REST output dataset name>",
                "type": "DatasetReference"
            }
        ],
        "typeProperties": {
            "source": {
                "type": "<source type>"
            },
            "sink": {
                "type": "RestSink",
                "requestMethod": "POST",
                "httpRequestTimeout": "00:01:40",
                "requestInterval": 10,
                "writeBatchSize": 10000,
                "httpCompressionType": "none",
            },
        }
    }
]

映射数据流属性

在数据流中,REST 支持集成数据集和内联数据集。

源转换

属性 描述 必需
请求方法 HTTP 方法。 允许的值为 GETPOST
relativeUrl 包含数据的资源的相对 URL。 未指定此属性时,仅使用链接服务定义中指定的 URL。 HTTP 连接器从以下组合 URL 复制数据:[URL specified in linked service]/[relative URL specified in dataset]
附加头信息 其他 HTTP 请求标头。
httpRequestTimeout 用于获取响应的 HTTP 请求的超时 (TimeSpan 值)。 该值是用于获取回应的超时时间,而不是读取回应数据的超时时间。 默认值为 00:01:40
请求间隔 不同请求之间的间隔时间(以毫秒为单位)。 请求时间间隔值应当为 [10, 60000] 范围中的数字。
QueryParameters.request_query_parameter 或 QueryParameters['request_query_parameter'] “request_query_parameter”由用户定义,引用下一个 HTTP 请求 URL 中的一个查询参数名称。

接收器转换

属性 描述 必需
附加头信息 其他 HTTP 请求标头。
httpRequestTimeout 用于获取响应的 HTTP 请求的超时 (TimeSpan 值)。 此值是获取响应的超时,而不是写入数据的超时。 默认值为 00:01:40
请求间隔 不同请求之间的间隔时间(以毫秒为单位)。 请求时间间隔值应当为 [10, 60000] 范围中的数字。
HTTP压缩类型 (httpCompressionType) 使用最佳压缩级别发送数据时要使用的 HTTP 压缩类型。 允许的值为 nonegzip
writeBatchSize 每批写入 REST 接收端的记录数。 默认值为 10000。

可以设置 delete、insert、update 和 upsert 方法,以及相应的行数据,这些数据将发送到 REST 终端以进行 CRUD 操作。

REST 数据流的截图。

示例数据流脚本

注意在汇盘前使用了 alter 行变换,用来指示 Data Factory 对你的 REST 汇执行什么类型的操作。 这个操作可以是插入、更新、更新或删除。

AlterRow1 sink(allowSchemaDrift: true,
	validateSchema: false,
	deletable:true,
	insertable:true,
	updateable:true,
	upsertable:true,
	rowRelativeUrl: 'periods',
	insertHttpMethod: 'PUT',
	deleteHttpMethod: 'DELETE',
	upsertHttpMethod: 'PUT',
	updateHttpMethod: 'PATCH',
	timeout: 30,
	requestFormat: ['type' -> 'json'],
	skipDuplicateMapInputs: true,
	skipDuplicateMapOutputs: true) ~> sink1

注意

数据流在处理 N 页时生成总共 N+1 API 调用。 这包括一个用于推断架构的初始调用,后跟对应于从源中提取的页数的 N 个调用。

分页支持

当你从REST API复制数据时,REST API通常会将单个请求的响应有效载荷大小限制在合理范围内。 为了返回大量数据,它会将结果拆分为多个页面,并要求调用者连续发送请求以获取下一页结果。 通常,单页请求是动态的,由前一页回复中返回的信息组成。

此泛型 REST 连接器支持以下分页模式:

  • 下一个请求的绝对或相对 URL = 当前响应正文中的属性值
  • 下一个请求的绝对或相对 URL = 当前响应标头中的标头值
  • 下一个请求的查询参数 = 当前响应正文中的属性值
  • 下一个请求的查询参数 = 当前响应标头中的标头值
  • 下一个请求的标头 = 当前响应正文中的属性值
  • 下一个请求的标头 = 当前响应标头中的标头值

分页规则 定义为数据集中的字典,包含一个或多个大小写区分键值对。 该配置用于从第二页开始生成请求。 当连接器收到 HTTP 状态代码 204(无内容)或任何 JSONPath 表达式返回 paginationRules NULL 时,连接器停止迭代。

分页规则中支持的键

描述
AbsoluteUrl 指示用于发出下一个请求的 URL。 它可以是绝对 URL 或相对 URL
QueryParameters.request_query_parameter 或 QueryParameters['request_query_parameter'] “request_query_parameter”由用户定义,引用下一个 HTTP 请求 URL 中的一个查询参数名称。
Headers.request_header 或 Headers['request_header'] “request_header”由用户定义,引用下一个 HTTP 请求中的一个标头名称。
结束条件:end_condition “end_condition”由用户定义,指示在下一个 HTTP 请求中结束分页循环的条件。
MaxRequestNumber (最大请求数量) 指示最大分页请求数。 设置为空表示没有限制。
支持RFC5988 默认情况下,如果未定义分页规则,则此值设置为 true。 可以通过将 supportRFC5988 设置为 false 或从脚本中删除此属性来禁用该规则。

分页规则中支持的值

价值 描述
Headers.response_header 或 Headers['response_header'] “response_header”由用户定义,引用当前 HTTP 响应中的一个标头名称,其值用于发出下一个请求。
以“$”(表示响应正文的根)开头的 JSONPath 表达式 响应正文应仅包含一个 JSON 对象,不支持将对象数组作为响应正文。 JSONPath 表达式应返回单个基元值,该值用于发出下一个请求。

注意

映射数据流中的分页规则与复制活动中的规则在以下方面有所不同:

  1. 映射数据流不支持范围。
  2. [''] 不支持在映射数据流中使用。 请改为使用 {} 对特殊字符进行转义。 例如 body.{@odata.nextLink},其 JSON 节点 @odata.nextLink 包含特殊字符 .
  3. 结束条件在映射数据流中受支持,但条件语法不同于复制活动中的条件语法。 body(而不是 $)用于指示响应正文。 header(而不是 headers)用于指示响应头。 下面是展示此差异的两个示例:
    • 示例 1:
      复制活动: “EndCondition:$.data”: “Empty”
      映射数据流:"EndCondition:body.data": "Empty"
    • 示例 2:
      复制活动: “EndCondition:headers.complete”: “Exist”
      映射数据流:"EndCondition:header.complete": "Exist"

分页规则示例

本部分提供了一系列的分页规则设置示例。

示例 1:QueryParameters 中的变量

此示例提供用于发送多个请求(其变量在 QueryParameters 中)的配置步骤。

多个请求:

baseUrl/api/now/table/incident?sysparm_limit=1000&sysparm_offset=0,
baseUrl/api/now/table/incident?sysparm_limit=1000&sysparm_offset=1000,
...... 
baseUrl/api/now/table/incident?sysparm_limit=1000&sysparm_offset=10000

步骤 1:在“基本 URL”或“相对 URL”中输入 sysparm_offset={offset},如以下屏幕截图所示:

该屏幕截图显示了一个用于发送多个请求的配置,这些请求的变量包含在查询参数中。

该屏幕截图显示了另一个用于发送多个请求的配置,这些请求的变量包含在查询参数中。

步骤 2:将“分页规则”设置为选项 1 或选项 2:

  • 选项 1:"QueryParameters.{offset}" : "RANGE:0:10000:1000"

  • 选项 2:"AbsoluteUrl.{offset}" : "RANGE:0:10000:1000"

示例2:AbsoluteUrl中的变量

此示例提供用于发送多个请求(其变量在 AbsoluteUrl 中)的配置步骤。

多个请求:

BaseUrl/api/now/table/t1
BaseUrl/api/now/table/t2
...... 
BaseUrl/api/now/table/t100

步骤 1:在“链接服务配置”页的“基本 URL”中或在“数据集连接”窗格的“相对 URL”中输入 {id}

该屏幕截图显示了一个用于发送多个请求的配置,这些请求的变量包含在绝对 URL 中。

该屏幕截图显示了另一个用于发送多个请求的配置,这些请求的变量包含在绝对 URL 中。

步骤 2:将“分页规则”设置为 "AbsoluteUrl.{id}" :"RANGE:1:100:1"

示例3:头部中的变量

此示例提供用于发送多个请求(其变量在 Headers 中)的配置步骤。

多个请求:

RequestUrl: https://example/table
Request 1: Header(id->0)
Request 2: Header(id->10)
......
Request 100: Header(id->100)

步骤 1:在{id}中输入

步骤 2:将“分页规则”设置为“Headers.{id}”:“RARNGE:0:100:10”

该屏幕截图显示了用于发送多个请求的分页规则,这些请求的变量包含在标头中。

示例4:变量在AbsoluteUrl/QueryParameters/Headers中,结尾变量未预定义,结尾条件基于响应

此示例提供配置步骤来发送多个请求,其变量位于 AbsoluteUrl/QueryParameters/Headers 中,但未定义结束变量。 对于不同的响应,示例 4.1-4.6 中显示了不同的结束条件规则设置。

多个请求:

Request 1: baseUrl/api/now/table/incident?sysparm_limit=1000&sysparm_offset=0, 
Request 2: baseUrl/api/now/table/incident?sysparm_limit=1000&sysparm_offset=1000,
Request 3: baseUrl/api/now/table/incident?sysparm_limit=1000&sysparm_offset=2000,
...... 

本例中出现两种响应:

响应 1:

{
    Data: [
        {key1: val1, key2: val2
        },
        {key1: val3, key2: val4
        }
    ]
}

响应 2:

{
    Data: [
        {key1: val5, key2: val6
        },
        {key1: val7, key2: val8
        }
    ]
}

步骤 1:按示例 1 设置“分页规则”的范围,并将范围末尾留空,其形式为 "AbsoluteUrl.{offset}": "RANGE:0::1000"

步骤 2:根据不同的上一个响应设置不同的结束条件规则。 请参阅以下示例:

  • 示例 4.1:当响应中的特定节点的值为空时,分页结束

    REST API 返回采用以下结构的上一个响应:

    {
        Data: []
    }
    

    将结束条件规则设置为 "EndCondition:$.data": "Empty",以便在响应中的特定节点的值为空时结束分页。

    该屏幕截图显示了示例 4.1 的结束条件设置。

  • 示例4.2:当响应中特定节点的值不存在时,分页结束

    REST API 返回采用以下结构的上一个响应:

    {}
    

    将结束条件规则设置为 “EndCondition:$.data”:“NonExist” ,以在响应中特定节点的值不存在时结束分页。

    该屏幕截图显示了示例 4.2 的结束条件设置。

  • 示例 4.3:当响应中的特定节点的值存在时,分页结束

    REST API 返回采用以下结构的上一个响应:

    {
        Data: [
            {key1: val991, key2: val992
            },
            {key1: val993, key2: val994
            }
        ],
                Complete: true
    }
    

    将结束条件规则设置为 "EndCondition:$.Complete": "Exist",以便在响应中的特定节点的值存在时结束分页。

    该屏幕截图显示了示例 4.3 的结束条件设置。

  • 示例 4.4:当响应中的特定节点的值是用户定义的常量值时,分页结束

    REST API 返回采用以下结构的响应:

    {
        Data: [
            {key1: val1, key2: val2
            },
            {key1: val3, key2: val4
            }
        ],
                Complete: false
    }
    

    ......

    上一个响应采用以下结构:

    {
        Data: [
            {key1: val991, key2: val992
            },
            {key1: val993, key2: val994
            }
        ],
                Complete: true
    }
    

    将结束条件规则设置为 "EndCondition:$.Complete": "Const:true",以便在响应中的特定节点的值是用户定义的常量值时结束分页。

    该屏幕截图显示了示例 4.4 的结束条件设置。

  • 示例4.5:当响应中的头部键值等于用户定义的const值时,分页结束

    REST API 响应中的标头键按照下面的结构显示:

    响应头 1:header(Complete->0)
    ......
    上一个响应头:header(Complete->1)

    将结束条件规则设置为 “EndCondition:headers.完成“:”Const:1“ ,当响应中的头部键值等于用户自定义的const值时,结束分页。

    该屏幕截图显示了示例 4.5 的结束条件设置。

  • 示例 4.6:当响应头中存在该键时,分页结束

    REST API 响应中的标头键按照下面的结构显示:

    响应头 1:header()
    ......
    上一个响应头:header(CompleteTime->20220920)

    将结束条件规则设置为 "EndCondition:headers.CompleteTime": "Exist",以便在响应头中存在该键时结束分页。

    该屏幕截图显示了示例 4.6 的结束条件设置。

示例5:设置终端条件以避免在未定义范围规则时出现无尽请求

此示例提供了在不使用范围规则时发送多个请求的配置步骤。 可以参考示例 4.1-4.6 来设置结束条件,以避免无限请求。 REST API 返回采用以下结构的响应,在此情况下,下一页的 URL 将在 paging.next 中表示。

{
    "data": [
        {
            "created_time": "2017-12-12T14:12:20+0000",
            "name": "album1",
            "id": "1809938745705498_1809939942372045"
        },
        {
            "created_time": "2017-12-12T14:14:03+0000",
            "name": "album2",
            "id": "1809938745705498_1809941802371859"
        },
        {
            "created_time": "2017-12-12T14:14:11+0000",
            "name": "album3",
            "id": "1809938745705498_1809941879038518"
        }
    ],
    "paging": {
        "cursors": {
            "after": "MTAxNTExOTQ1MjAwNzI5NDE=",
            "before": "NDMyNzQyODI3OTQw"
        },
        "previous": "https://graph.facebook.com/me/albums?limit=25&before=NDMyNzQyODI3OTQw",
        "next": "https://graph.facebook.com/me/albums?limit=25&after=MTAxNTExOTQ1MjAwNzI5NDE="
    }
}
...

上一个响应是:

{
    "data": [],
    "paging": {
        "cursors": {
            "after": "MTAxNTExOTQ1MjAwNzI5NDE=",
            "before": "NDMyNzQyODI3OTQw"
        },
        "previous": "https://graph.facebook.com/me/albums?limit=25&before=NDMyNzQyODI3OTQw",
        "next": "Same with Last Request URL"
    }
}

步骤 1:将“分页规则”设置为 "AbsoluteUrl": "$.paging.next"

步骤2:如果 next 最后一个响应总是与上一个请求的URL相同且不空,进程会发送无尽请求。 使用终结条件以避免无止境的请求。 因此,通过参考示例4.1至4.6来设定终结条件规则。

示例6:设置最大请求数以避免无止境请求

设置 MaxRequestNumber 以避免无限请求,如以下屏幕截图所示:

该屏幕截图显示了示例 6 的最大请求数设置。

示例7:RFC 5988分页规则默认支持

后端会自动根据头部中的RFC 5988风格链接获得下一个URL。

该屏幕截图显示了符合 RFC 5988 规范的 http 标头示例。

提示

如果不想启用此默认分页规则,可以在脚本中将 supportRFC5988 设置为 false 或将其删除。

该屏幕截图显示了如何禁用示例 7 的 RFC 5988 设置。

示例 8a:在映射数据流中使用分页时,下一个请求 URL 位于响应正文中

此示例说明当下一个请求 URL 来自响应正文时,如何在映射数据流中设置分页规则与结束条件规则。

响应架构如下所示:

该屏幕截图显示了示例 8 的响应架构。

应按以下屏幕截图所示设置分页规则:

该屏幕截图显示了如何为示例 8 设置分页规则。

默认情况下,分页在 body.{@odata.nextLink} 为空或为空时停止。

但如果最后一个响应主体中的 @odata.nextLink 值等于最后一个请求URL,就会导致无休止的循环。 若要避免这种情况,请定义结束条件规则。

  • 如果上一个响应中的“值”为,则可以按下面所示设置结束条件规则:

    该屏幕截图显示了当上一个响应为空时如何设置结束条件规则。

  • 如果响应头中完成键的值等于 true 指示分页结束,则可以按下面所示设置结束条件规则:

    该屏幕截图显示了当响应头中的 complete 键等于 true(指示分页结束)时如何设置结束条件规则。

示例 8b:在复制活动中使用分页时,下一个请求 URL 位于响应正文中

此示例演示当下一个请求 URL 包含在响应正文中时,如何在复制活动中设置分页规则。

响应架构如下所示:

屏幕截图显示示例 8b 的响应架构。

应按以下屏幕截图所示设置分页规则:

屏幕截图显示如何为示例 8b 设置分页规则。

示例 9:在映射数据流中使用分页时,响应格式为 XML 并且下一个请求 URL 来自响应正文

此示例说明当响应格式为 XML 并且下一个请求 URL 来自响应正文时,如何在映射数据流中设置分页规则。 如以下屏幕截图所示,第一个 URL 是 https://<user>.dfs.core.chinacloudapi.cn/bugfix/test/movie_1.xml

该屏幕截图显示了响应格式为 XML 且下一个请求 URL 来自响应正文。

响应架构如下所示:

该屏幕截图显示了示例 9 的响应架构。

分页规则语法与示例 8 中的语法相同,应按以下示例所示进行设置:

该屏幕截图显示了如何为示例 9 设置分页规则。

按原样导出 JSON 响应

可以使用 REST 连接器将 REST API 的 JSON 响应 as-is 导出到各种基于文件的存储系统(接收器)。 要实现这种模式无关的复制行为,请使用默认模式映射(不要在复制活动的映射标签页中定义任何映射)。

模式映射

若要将数据从 REST 终结点复制到表格接收器,请参阅架构映射

有关 Azure 数据工厂 中复制活动支持作为源和汇聚点的数据存储的列表,请参阅 支持的数据存储和格式