在 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
我的目标是在 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