你可以透過向函式的公開端點發送 HTTP 請求,從外部應用程式調用 Fabric 的使用者資料函式。 這讓你能將 Fabric 商業邏輯整合進網頁應用程式、自動化腳本、微服務,或任何 Fabric 環境外的系統。
在本教學課程中,您會:
- 註冊一個 Microsoft Entra 應用程式以進行認證
- 取得函式的公開網址並啟用公開存取
- 建立一個 Python 主控台應用程式來呼叫函式
- 了解回應架構與 HTTP 狀態碼
先決條件
- 安裝在您本機的 Visual Studio Code。
- Python 3.11 安裝在你的本機上。
- 一個 Microsoft Fabric 帳號。 你可以註冊免費試用。
- Fabric 工作區。
- 一個已發佈的使用者資料功能項目。 相關說明請參見「 在 Visual Studio Code 建立使用者資料函 數」或 「在入口網站建立使用者資料函數」。
建立 Microsoft Entra 應用程式
若要從外部應用程式呼叫使用者資料函式,您需要在 Microsoft Entra ID 中註冊應用程式。 這個應用程式註冊提供你的 Python 應用程式用來認證的憑證。
前往 Microsoft Entra 管理中心 ,依照快速入門(QuickStart)中描述的步驟註冊應用程式: 使用 Microsoft 身份平台註冊應用程式。
Microsoft Entra 應用程式 (用戶端) 識別碼 和 目錄 (租用戶識別碼) 值會出現在 [摘要] 方塊中。 記錄這些值,因為稍後需要這些值。
在 [管理] 列表中,選取 [API 許可權],然後選取 [新增許可權]。
新增 PowerBI 服務,選取 [ 委派的許可權],然後選取 [UserDataFunction.Execute.All ] 或 [專案]。Execute.All 權限。 確認不需要系統管理員同意。
返回 管理 設定,然後選取 驗證 新增>平台>單頁應用程式。
針對本機開發目的,請在 [重新導向 URI
http://localhost:3000新增 ,並確認應用程式已針對授權碼流程啟用,且具有適用於程式代碼交換的證明金鑰 (PKCE) 。 選取 [設定] 按鈕來儲存變更。 如果應用程式遇到與跨來源要求相關的錯誤,請在上一個步驟中使用相同的重新導向 URI 新增 行動和桌面應用程式 平台。回到 [驗證],向下捲動至 [進階設定],然後在 [允許公用用戶端流程] 下,選取 [[是][啟用下列行動和桌面流程]。
建立主控台應用程式
現在你已經註冊了應用程式,建立一個 Python 主控台應用程式來驗證並呼叫你的使用者資料函式。
取得要呼叫的函式網址
每個使用者資料函式都有獨特的公開 URL,作為其 REST API 端點。 在你能從外部應用程式呼叫這個函式之前,你需要先啟用公開存取並取得網址。
要取得函式網址:
在 Fabric 入口網站中,開啟你的使用者資料功能項目。
請確保你是 只執行 模式,而不是 開發 模式。
在 函數總管中,將滑鼠移至函數名稱並選擇省略號(...)。
選取 屬性。
在屬性面板中,確保已啟用 公開存取 。 如果沒有,請選擇切換來啟用。
複製 公開網址 ,供你的 Python 應用程式使用。
小提示
如果已經啟用公開存取,你可以跳過屬性面板。 在 函式總管中,選擇函式名稱旁的省略號(...),並選擇 複製函式 URL。 這會複製與屬性窗格中的 公開 URL 相同的 URL。
在你的應用程式代碼中,將
FUNCTION_URL佔位符替換為你複製的網址。
設定 Python 專案
建立一個帶有虛擬環境的 Python 專案,並安裝所需的相依關係。
例如,為你的 Python 應用程式
my-data-app建立一個新資料夾。在 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
新增應用程式代碼
加入 Python 程式碼,該程式碼能用 Microsoft Entra ID 驗證並呼叫你的使用者資料函式。
在你的專案資料夾裡建立一個命名
app.py的檔案。加入下列程式碼。 用你之前複製的公開網址替換
<REPLACE WITH USER DATA FUNCTION 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 Identity 用戶端函式庫。
執行應用程式
要執行應用程式,請在終端機中使用以下指令:
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:此特定函式執行的唯一識別碼。 對於故障排除和關聯日誌非常有用。
-
狀態:函式執行的結果。 可能的值為
Succeeded、、BadRequestFailed、Timeout和ResponseTooLarge。 -
輸出:你函式的回傳值。 資料型態和結構取決於你的函式回傳什麼。 例如,如果你的函式回傳一個字串,那麼
output就是一個字串。 如果你的函式回傳一個字典,則output是一個 JSON 物件。 -
錯誤:執行過程中擷取的錯誤清單。 每個錯誤包含一個
name、message,以及包含更多細節的鍵值對的可選properties物件。 當函式成功時,為空。
回應碼
該函式會根據執行回傳以下 HTTP 代碼。
| 回應碼 | Message | 說明 |
|---|---|---|
| 200 | 成功 | 要求成功。 |
| 400 | 錯誤的請求 | 這個請求並不成立。 此回應可能是由於缺少或錯誤的輸入參數值、資料型態或名稱所致。 此回應也可能是因為關閉了某項功能的公用存取所造成。 |
| 403 | 禁止 | 回應太大,呼叫失敗。 |
| 408 | 請求逾時 | 由於執行時間超過最大允許時間,請求失敗。 |
| 409 | 衝突 | 由於狀態衝突,申請無法完成。 此錯誤可能由未處理的異常或使用者憑證錯誤所引起。 |
| 422 | 錯誤的請求 | 由於在函式中引發了「UserThrownError」,導致要求失敗。 |
| 500 | 內部伺服器錯誤 | 由於服務中的內部錯誤,請求失敗。 |