微軟最近推出了一個開發工具叫 Data API builder (DAB),這是一套開源的資料處理引擎,他可以快速的將資料庫的資料轉換成 REST 與 GraphQL API 端點(Endpoint),方便我們快速的建立安全的 CRUD 應用程式。有了 Data API builder 之後,針對大多數 CRUD 類型的應用程式,幾乎都可以在幾分鐘之內完成 API 開發,只要使用一些前端框架就可以快速的建立一個完整的應用程式。
簡介 Data API builder
Data API builder 可以透過 REST 或 GraphQL 端點安全地公開資料庫物件 (Table, View, Stored Procedure),以便可以在任何平台、任何語言和任何裝置上存取您的資料。透過整合且靈活的策略引擎,也可以確保精細的安全性設定,確保資料安全。目前 Data API builder 支援 Azure SQL Database、SQL Server、PostgreSQL、MySQL 和 Cosmos DB 等資料庫整合,為開發人員提供了前所未有的效率提升。
Data API builder 是開源的,可在任何平台上運行。它可以透過 Azure Static Web App 中提供的新功能 Database Connection (資料庫連線) 執行,也可以跑在本機或容器中。
Data API builder 的運作架構可以從下圖理解:
安裝 Data API builder
目前的 Data API builder 是基於 .NET 6.0 開發的,並且發佈為 .NET 全域工具 (Global Tool),所以你只要先安裝 .NET SDK 之後,就可以透過以下命令安裝:
dotnet tool install -g microsoft.dataapibuilder
安裝完成之後,就可以透過以下命令來查看 Data API builder 安裝的版本:
dab --version
C:\>dab --version
Microsoft.DataApiBuilder 0.8.52+c69925060e1942d28515b9c4b89ea24832da0c7c
快速上手 Data API builder
以下我就用一個完整的例子來示範 Data API builder 的開發方法:
-
先在 SQL Server 建立 ContosoUniversity 資料庫
-
準備一個專案目錄
mkdir dab
cd dab
-
初始化 Data API builder 設定檔
dab init --database-type "mssql" --connection-string "Server=(localdb)\MSSQLLocalDB;Database=ContosoUniversity;Trusted_Connection=True;TrustServerCertificate=true" --host-mode "Development"
執行結果訊息:
Information: Microsoft.DataApiBuilder 0.8.52+c69925060e1942d28515b9c4b89ea24832da0c7c
Information: Generating default config file: G:\Projects\dab\dab-config.json
Information: Config file generated.
Information: SUGGESTION: Use 'dab add [entity-name] [options]' to add new entities in your config.
這個步驟會建立一個 dab-config.json
設定檔,內容如下:
{
"$schema": "https://github.com/Azure/data-api-builder/releases/download/v0.8.52/dab.draft.schema.json",
"data-source": {
"database-type": "mssql",
"connection-string": "Server=.\\SQLEXPRESS;Database=ContosoUniversity;Trusted_Connection=True;TrustServerCertificate=true",
"options": {
"set-session-context": false
}
},
"runtime": {
"rest": {
"enabled": true,
"path": "/api"
},
"graphql": {
"enabled": true,
"path": "/graphql",
"allow-introspection": true
},
"host": {
"cors": {
"origins": [],
"allow-credentials": false
},
"authentication": {
"provider": "StaticWebApps"
},
"mode": "development"
}
},
"entities": {}
}
-
加入資料實體與資料來源的對應
這裡我們加入資料庫中的 dbo.Course
與 dbo.Department
表格,並對應到 Course
與 Department
實體(Entity),另外最重要的 --permissions
用來設定資料存取的權限,第一次在本機使用可以先設定為 anonymous:*
,這意味著我們透過 Data API builder 產生的 API Endpoing 允許「匿名存取」,且 *
代表支援所有動作(Action):
dab add Course --source dbo.Course --permissions "anonymous:*"
dab add Department --source dbo.Department --permissions "anonymous:*"
-
啟動 Data API builder
dab start
啟動之後就擁有了相當完整的 API 端點(REST + GraphQL)可以呼叫,而且也有提供 Swagger 介面與 OpenAPI Spec 可供參考:
Swagger: https://localhost:5001/swagger
OpenAPI: https://localhost:5001/api/openapi
GraphQL: https://localhost:5001/graphql
總結
看到這裡你應該可以發現,我們的整個專案只有「一個檔案」而已,也就是 DAB 的設定檔 dab-config.json
,然後就沒有然後了,整個資料庫指定的表格都可以快速的產生 REST 與 GraphQL 的 API Endpoint,直接可以呼叫使用,而且 CRUD 都可以直接使用!
方便歸方便,安全性才是最重要的,目前 DAB 可以支援 Authentication 與 Authorization 設定,不但可以限定特定實體的存取權限,也可以針對特定欄位(Field access)進行權限控管,透過 Database policy
控制,甚至可以做到 Item level security,這樣其實可以避免資料外洩的風險。
不過,目前 DAB 僅能支援 StaticWebApps
(EasyAuth) 與 AzureAD
這兩個身分認證提供者,使用上還算有點受限:
-
StaticWebApps
限定網站必須部署到 Azure Static Web Apps 才能使用,但是透過 EasyAuth 可以支援多家 Identity provider 的支援,靈活性好很多。
-
AzureAD
限定身分認證必須透過 Azure AD 來完成,如果你的組織使用 Microsoft 365 的話,這個應該是最方便的。所以我認為目前 DAB 比較適用於「企業內部」的 CRUD 類型的應用程式開發,可以節省大量開發時間,短時間內就可以開發出 API 來用。
如果要使用其他的身份驗證服務我還沒有深入研究,不過由於 DAB 是一套開放原始碼的專案,所以還是很有機會可以自行實作其他身份驗證服務的整合。
最後,我覺得 DAB 還是有很大的進步空間,目前無法實作太多需要「個人化」的資料查詢,所以 DAB 比較適用在「以資料為中心」的應用程式,若是有太多「個人化」或「商務邏輯」的 LOB 應用程式,就不太適合。
相關連結