可以通过向函数的公共终结点发送 HTTP 请求,从外部应用程序调用 Fabric 用户数据函数。 这样,便可以将 Fabric 业务逻辑集成到 Web 应用、自动化脚本、微服务或 Fabric 环境外部的任何系统。
在本教程中,你将:
- 注册Microsoft Entra 应用程序进行身份验证
- 获取函数的公共 URL 并启用公共访问
- 创建调用函数的 Python 控制台应用程序
- 了解响应架构和 HTTP 状态代码
先决条件
- 在本地计算机上已安装Visual Studio Code。
- 在本地计算机上安装了 Python 3.11。
- Microsoft Fabric 帐户。 可以注册免费试用版。
- 一个 Fabric 工作区。
- 已发布的用户数据函数项。 有关说明,请参阅 在 Visual Studio Code 中创建用户数据函数 或在 门户中创建用户数据函数。
创建 Microsoft Entra 应用
若要从外部应用程序调用用户数据函数,需要在 Microsoft Entra ID 中注册应用程序。 此应用注册提供 Python 应用程序用来进行身份验证的凭据。
转到 Microsoft Entra 管理中心 ,并使用快速入门中所述的步骤注册应用程序 :将应用程序注册到Microsoft标识平台。
Microsoft Entra 应用 应用程序(客户端)ID 和 目录(租户)ID 值显示在“摘要”框中。 记录这些值,因为稍后需要这些值。
在“管理”列表下,选择“API 权限”,然后选择“添加权限”。
添加 PowerBI 服务,选择 委派权限,然后选择 UserDataFunction.Execute.All 或 项。Execute.All 权限。 确认不需要管理员同意。
返回到 “管理 ”设置,然后选择“ 身份验证>添加平台>单页应用程序”。
出于本地开发目的,请在“重定向 URI”下添加
http://localhost:3000,并确认应用程序是否已启用具有代码交换证明密钥 (PKCE) 的授权代码流。 选择“配置”按钮以保存所做更改。 如果应用程序遇到与跨源请求相关的错误,请使用相同的重定向 URI 在上一步中添加 移动和桌面应用程序 平台。返回到“授权”,向下滚动到“高级设置”,然后在“允许公共客户端流”下,对“启用以下移动和桌面流”选择“是”。
创建控制台应用程序
有了应用注册后,请创建一个 Python 控制台应用程序,用于对用户数据函数进行身份验证和调用。
获取要调用的函数 URL
每个用户数据函数都有一个唯一的公共 URL,用作其 REST API 终结点。 在可以从外部应用程序调用函数之前,需要启用公共访问并获取 URL。
获取函数 URL:
在 Fabric 门户中,打开用户数据函数项。
请确保处于 “仅运行 ”模式,而不是 “开发 ”模式。
在 Functions 资源管理器中,将鼠标悬停在函数的名称上,然后选择省略号(...)。
选择 属性。
在“属性”窗格中,确保已启用 公共访问 。 如果没有,请选择该切换开关以启用它。
复制 公共 URL ,以便在 Python 应用程序中使用。
小窍门
如果已启用公共访问,则可以跳过“属性”窗格。 在 函数资源管理器中,选择函数名称旁边的省略号(...),然后选择 “复制函数 URL”。 这会在“属性”窗格中复制与 公共 URL 相同的 URL 。
在应用程序代码中,将
FUNCTION_URL占位符替换为复制的 URL。
设置 Python 项目
使用虚拟环境创建 Python 项目并安装所需的依赖项。
例如
my-data-app,为 Python 应用创建新文件夹。在 Visual Studio Code 中打开文件夹。
打开 命令面板 (Ctrl+Shift+P),并搜索 Python:创建环境。
选择 venv 作为环境类型。
选择 Python 3.11 作为解释器版本。
在 Visual Studio Code 中打开新终端(Ctrl+)。
激活 Python 虚拟环境:
Windows:
.venv\Scripts\activatemacOS/Linux:
source .venv/bin/activate安装所需的 Python 库:
pip install azure-identity requests
添加应用程序代码
添加使用 Microsoft Entra ID 进行身份验证并调用用户数据函数的 Python 代码。
在项目文件夹中创建一个名为
app.py的文件。添加以下代码。 将
<REPLACE WITH USER DATA FUNCTION URL>替换为您之前复制的公共 URL。from azure.identity import InteractiveBrowserCredential import requests import json # Acquire a token using interactive browser authentication # This opens a browser window for the user to sign in with their Microsoft account credential = InteractiveBrowserCredential() scope = "https://analysis.windows.net/powerbi/api/user_impersonation" token = credential.get_token(scope) if not token.token: print("Error: Could not get access token") exit(1) # Prepare headers with the access token headers = { "Authorization": f"Bearer {token.token}", "Content-Type": "application/json" } FUNCTION_URL = "<REPLACE WITH USER DATA FUNCTION URL>" # Prepare the request data (modify to match your function's expected input) data = {"name": "John"} try: # Call the user data function public URL response = requests.post(FUNCTION_URL, json=data, headers=headers) response.raise_for_status() print(json.dumps(response.json(), indent=2)) except Exception as e: print(f"Error: {e}")注释
此示例为了简单起见使用
InteractiveBrowserCredential,这将打开浏览器进行交互式登录。 对于生产应用程序,请将您已注册的 Microsoft Entra 应用程序中的client_id和tenant_id传递给InteractiveBrowserCredential,或者使用其他凭据类型,例如用于服务到服务身份验证的ClientSecretCredential。 有关详细信息,请参阅 适用于 Python 的 Azure 标识客户端库。
运行应用程序
若要运行应用程序,请在终端中使用以下命令:
python app.py
此时会打开一个浏览器窗口,用于使用Microsoft帐户登录。 身份验证后,应用程序将调用用户数据函数并输出响应。
若要在 Visual Studio Code 中调试应用程序,请通过单击行号旁边的边栏来设置断点,然后按 F5 开始调试。 有关详细信息,请参阅 Visual Studio Code 中的 Python 调试。
输出架构
从外部应用程序调用用户数据函数时,响应正文遵循以下 JSON 架构:
{
"functionName": "hello_fabric",
"invocationId": "1234567890",
"status": "Succeeded",
"output": "Hello, John!",
"errors": []
}
响应包括以下属性:
- functionName:已执行的函数的名称。
- invocationId:此特定函数执行的唯一标识符。 非常有助于故障排除和日志关联。
-
status:函数的执行结果。 可能的值为
Succeeded、、BadRequest、FailedTimeout、 和ResponseTooLarge。 -
output:函数的返回值。 数据类型和结构取决于函数返回的内容。 例如,如果函数返回字符串,
output则为字符串。 如果函数返回字典,output则为 JSON 对象。 -
errors:执行期间捕获的错误列表。 每个错误包含一个
name、message,以及可选的properties对象,这些对象中含有键值对和更多详细信息。 函数成功时为空。
响应代码
由于执行,该函数返回以下 HTTP 代码。
| 响应代码 | Message | 说明 |
|---|---|---|
| 200 | 成功 | 请求成功。 |
| 400 | 错误的请求 | 请求无效。 此响应可能是由于输入参数值、数据类型或名称缺失或不正确的。 此响应也可能由为函数关闭公共访问导致的。 |
| 403 | 已禁止 | 响应太大,调用失败。 |
| 408 | 请求超时 | 由于执行时间超过允许的最大时间,请求失败。 |
| 409 | 冲突 | 由于存在冲突状态,无法完成请求。 此错误可能是由未经处理的异常或用户凭据错误引起的。 |
| 422 | 错误的请求 | 请求由于函数中引发的 UserThrownError 而失败。 |
| 500 | 内部服务器错误 | 请求由于服务中的内部错误而失败。 |