在 Azure 数据工厂 v2 中对 REST Web 服务使用 JSON 正文查询

Use a JSON body query on a REST Web service in Azure Data Factory v2

我的目标是在 JSON 网络服务上进行身份验证:

POST /api/authenticate/basic HTTP/1.1
Content-Type: application/json
Content-Length: 123
Host: test.biz

{
  "login" : "user",
  "password" : "pass",
  "site" : "foo-site"
}

我需要在请求正文中使用 JSON 数组。可悲的是,在 Microsoft 文档中,他们说他们不支持 JSON 请求。

https://docs.microsoft.com/en-us/azure/data-factory/connector-rest?tabs=synapse-analytics

REST connector ignores any "Accept" header specified in additionalHeaders. As REST connector only support response in JSON, it will auto generate a header of Accept: application/json.

body里好像可以发一个文件,不过我有点不清楚

POST data to REST API using Azure Data Factory

是否可以在数据流中实现 JSON 查询?并获得令牌

在第二个目标中,出于安全原因,我更喜欢使用保管库的密码生成它。是否可以动态创建生成 JSON 数组?

恐怕我们无法在 REST 链接服务或数据集中设置 POST 请求。

我们可以通过管道内的“Web 请求”组件解决问题。

{
    "name": "pipeline1",
    "properties": {
        "activities": [
            {
                "name": "Web1",
                "type": "WebActivity",
                "dependsOn": [],
                "policy": {
                    "timeout": "7.00:00:00",
                    "retry": 0,
                    "retryIntervalInSeconds": 30,
                    "secureOutput": false,
                    "secureInput": false
                },
                "userProperties": [],
                "typeProperties": {
                    "url": "https://d1.a.biz/api",
                    "method": "POST",
                    "body": {
                        "login": "",
                        "password": "",
                        "site": ""
                    }
                }
            },
            {
                "name": "Set variable1",
                "type": "SetVariable",
                "dependsOn": [
                    {
                        "activity": "Web1",
                        "dependencyConditions": [
                            "Succeeded"
                        ]
                    }
                ],
                "userProperties": [],
                "typeProperties": {
                    "variableName": "token",
                    "value": {
                        "value": "@activity('Web1').output.Response",
                        "type": "Expression"
                    }
                }
            }
        ],
        "variables": {
            "token": {
                "type": "String"
            }
        },
        "annotations": []
    } }

首先,您可以将 JSON 主体放入 Rest API POST 但您不能在链接服务或数据集中设置它,您需要设置它在 Copy activity 本身 请参见下面的图片和 ADF 代码。

{
    "name": "Copy data1",
    "type": "Copy",
    "dependsOn": [],
    "policy": {
        "timeout": "7.00:00:00",
        "retry": 0,
        "retryIntervalInSeconds": 30,
        "secureOutput": false,
        "secureInput": false
    },
    "userProperties": [],
    "typeProperties": {
        "source": {
            "type": "RestSource",
            "httpRequestTimeout": "00:01:40",
            "requestInterval": "00.00:00:00.010",
            "requestMethod": "POST",
            "requestBody": "{\n    \"method\": \"GetFeed\",\n    \"params\": {\n        \"credentials\": {\n            \"database\": \"aci_logistics\",\n            \"sessionId\": \"xxxxxxxxxxxxxxxx\",\n            \"userName\": \"xxxxxxxxxxx@x.com\"\n        },\n        \"typeName\": \"LogRecord\",\n        \"search\": {\n            \"fromDate\": \"2021-09-28T00:00:00.000Z\",\n            \"toDate\": \"2021-08-01T01:00:00.000Z\"\n        }\n    }\n}"
        },
        "sink": {
            "type": "JsonSink",
            "storeSettings": {
                "type": "AzureDataLakeStoreWriteSettings"
            },
            "formatSettings": {
                "type": "JsonWriteSettings"
            }
        },
        "enableStaging": false
    },
    "inputs": [
        {
            "referenceName": "RestResource4",
            "type": "DatasetReference"
        }
    ],
    "outputs": [
        {
            "referenceName": "Json3",
            "type": "DatasetReference"
        }
    ]
}

其次,是的,您可以从 POST 的结果中提取特定字段。假设您已经创建了一个变量。您将需要一个设置变量 activity(就像您已经拥有的那样)。该值将是您的网络 activity 的输出,但取决于您需要哪个字段以及 POST 结果的 structure/format。在我的示例中,我得到了如下 JSON 结果。

{
    "result": {
        "credentials": {
            "database": "xxxxx",
            "sessionId": "xxxxxxx",
            "userName": "xxxxxxxxxxxxxx"
        }
    }
}

假设我想提取 sessionId,我的 Set 变量 activity 中的值类似于

@activity('Web1').output.result.credentials.sessionId