【问题标题】:Azure Data Factory Rest API - With AccountCode, APIKey & TokenAzure 数据工厂 Rest API - 带有帐户 ID、API 密钥或令牌
【发布时间】:2022-11-18 14:51:11
【问题描述】:

我有一个用例,其中我需要连接到 API 以请求数据。

  • API 需要有效的令牌来处理请求。
  • 为了生成令牌,我有一个帐户代码和密钥

假设 BaseURL 为BaseURL - http://api.xxxxx.com/{accountCode}/data(需要传递账号的值)

**需要运行以下 Python/Java 脚本来获取 dateToken 和令牌

  • 如果我们使用 Python 3.6 或更高版本。下面是代码-**

- 开始 - {

import time

import requests

from hashlib import md5

account_code = "<account_name>"
key = "<api_key>"
actual_unix_time = int(time.time_ns() / 1000) # in milliseconds
TTL = 31536000000 # for 1 year
expiration_time = actual_unix_time + TTL
base_url = "https://api.xxxxx.com"
url = f"/{account_code}/data?fromDate=last6Hours&granularity=minute&type=ALL%2CVOD%2CLIVE&operation=reduceJoin&metrics=bufferratio"
pre_url = f"{url}&dateToken={expiration_time}"
token_generated = md5(f"{pre_url}{key}".encode('utf-8'))
token_value = token_generated.hexdigest()
request_url = f"{base_url}{pre_url}&token={token_value}"
response = requests.get(request_url)

print(response)
print(response.text)

} - 结尾 -

- 如果我们使用 Java。下面是代码 -

- 开始 - {

var key = pm.environment.get("NPAW-API-KEY"); 
var base_url = "https://api.xxxxx.com";

var url = pm.request.url.toString(); 
var path = url.replace(base_url, ''); 
var pre_url = pm.variables.replaceIn(path);

var moment = require('moment'); 
var actual_unix_time = moment().unix()*1000;

var TTL = 31536000000

var expiration_time = (actual_unix_time + TTL); 
var pre_url = pre_url+"&dateToken="+expiration_time;

var token_generated = CryptoJS.MD5(pre_url + key).toString();

var token_value = token_generated;

var request_url = (base_url+pre_url+'&token='+token_value).toString();

} - 结尾 -

最终 URL 的示例 - https://api.xxxxx.com/kb-vivek/data?fromDate=today&granularity=hour&type=ALL,VOD,LIVE&operation=reduceJoin&metrics=views,playtime&dateToken=1699016056000&token=7a9c97a4d4f108d1d32be2f7f8d00731

我尝试使用 Postman,其中,我可以在 Pre-Request 脚本中传递上述脚本,并为 accountCode 和 Secret Key 设置环境变量,我能够达到预期的结果。

问题:如何在 Azure 数据工厂中实现这一目标?

【问题讨论】:

  • 您能否澄清一下:您想使用 python/java 脚本获取帐户代码和令牌(以构建 URL)?问题是如何在 ADF 中执行此操作?或者python代码直接给出需要的响应,而你想在ADF中实现?如我错了请纠正我。
  • 嗨@Saideep,是的,获取 dateToken 和令牌 - 我需要使用上面的代码。相同的代码还为我提供了一个带有日期标记和标记的 URL,我可以使用它来获取所需的输出。
  • 那么,你想在 ADF 中实现这个逻辑吗?就像在 ADF 中使用 dateToken 和令牌构建 URL 并调用 URL?或者您只想使用上面的脚本本身?
  • 我想构建 URL 并将其保存到一个变量中,我可以进一步使用它来调用

标签: azure-data-factory


【解决方案1】:
  • 为了达到要求,我们需要结合使用设置变量和数据流(以生成 md5 十六进制字符串并将最终 url 存储在文件中)。
  • 首先,我创建了 4 个参数,其值如下所示:
base_url: https://api.xxxxx.com
account_code: <account_name>
key: <api_key>
TTL: 31536000000

  • 首先,我创建了一个变量来构建url。我使用了以下动态内容:
/@{pipeline().parameters.account_code}/data?fromDate=last6Hours&granularity=minute&type=ALL%2CVOD%2CLIVE&operation=reduceJoin&metrics=bufferratio

  • 接下来,我用以下动态内容构建了pre_url
@{variables('url')}&dateToken=@{add(div(sub(ticks(utcNow()), ticks('1970-01-01')),10),31536000000)}

  • 现在,为了对字符串进行编码并将其转换为 md5 十六进制字符串,我使用了数据流。我已将 base_url, pre_url and key 从管道传递到数据流。

  • 我从 blob 存储中获取了一个只有一行的示例 csv 文件(此文件中的数据无关紧要,但要确保它只有 1 行)。

  • 我创建了一个派生列,通过连接 base_url, pre_url and encoded md5 hex string 来创建最终 URL。使用以下内容:
$base_url+$pre_url+'&token='+md5(encode(concat($pre_url,$key)))

  • 现在我正在使用接收器设置中的output to single file 选项将此数据写入文件。

  • 当我调试管道时,文件将写入我的存储帐户。该文件的内容如下所示:

笔记:

  • 现在由于您想要生成一次日期令牌并使用它一年,我已将数据写入文件。
  • 您运行此管道一次并生成一个具有所需 URL 的文件(如上所述)。任何时候你想访问这个 URL,你可以使用 look up activity 来访问任何需要的 URL。
  • 我已经使用utcNow()生成了dateToken。但是如果您有任何特定的日期,您可以简单地以正确的格式使用它(代替 utcNow())。

【讨论】:

  • 嗨 Sandeep,非常感谢您在下面。我会试试这个并确认你。如果我不正确,请纠正我。我认为令牌是在发出请求时来自 API 的。您如何能够在不访问 API URL 的情况下生成 Token 和 DateToken?
  • 您提供的 python 代码不是从 API 获取令牌,而是使用代码(没有 API)生成令牌,然后在构建它后调用 URL。我从您的 Python 代码中提取了逻辑并在 ADF 中实现了它并构建了 URL(与 Python 代码中的相同)。如果我误解了要求,请纠正我。
  • 谢谢赛迪普。你的理解是正确的。我会尝试您建议的答案并确认。
  • 我已经发布了另一个与使用查找活动相关的查询,你能帮我解决这个问题吗? stackoverflow.com/questions/74363693/…
  • 你能澄清一下吗:你提到单引号是有效的,这是工作查询和动态内容查询之间的唯一显着区别
猜你喜欢
  • 2022-10-18
  • 1970-01-01
  • 2019-05-06
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
  • 2022-08-03
相关资源
最近更新 更多