การ Call ตัว Power BI REST API ผ่าน Windows PowerShell/Postman
Content difficulty — Technical
จากตอนที่แล้ว มีเกริ่นๆบ้างในเรื่องของการใช้ Azure Logic Apps ทำการ call API เพื่อ refresh ตัว Power BI Embedded มาคราวนี้มีจะมาดูกันว่าเราสามารถเรียก API ของ Power BI Services ได้อย่างไร
หลักๆนอกจากการเรียกผ่าน Programming Language แล้วก็มีการเรียกผ่านตัว Tools อย่าง Postman หรือ cURL ในการดู API response ของ modern application ต่างๆ แต่ใน Microsoft Services เราก็สามารถใช้ module ของ Windows PowerShell ในการ call API นี้ได้เช่นกัน
ก่อนอื่นมาดู Power BI API references ก่อนที่ https://docs.microsoft.com/en-us/rest/api/power-bi/ โดยตัวอย่างจะเลือกมา 2 method ก่อนคือ GET เพื่อเรียกดูข้อมูลของ Power BI และ POST เพื่อ add ข้อมูลหรือสร้างสิ่งต่างๆกลับเข้าไปในระบบ
ตัวอย่างของ GET ในการเรียก Dashboard list ทั้งหมดของ My workspace บน Power BI Services
GET https://api.powerbi.com/v1.0/myorg/dashboards
ตัวอย่างของ POST เป็นการ clone report ที่มีอยู่แล้วใน My workspace อีก copy นึง บน Power BI Services
POST https://api.powerbi.com/v1.0/myorg/reports/{reportId}/Clone
ส่วน parameter ที่เป็น {reportId} ของ POST จะเอามาจาก ID ของ report ชื่อ Sales and Marketing Sample PBIX
Windows PowerShell
แบบ PowerShell จะค่อนข้างง่ายกว่า Postman เนื่องจากมี command ในการ Authentication ให้ และไม่ต้องไปทำ app registration เหมาะกับการทำ ad hoc
อันดับแรกเราเข้า PowerShell แล้ว Open as Administrator จากนั้นทำการ Install ตัว module ชื่อว่า MicrosoftPowerBIMgmt.Profile จากนั้นก็ทำการ import
run 2 command ข้างล่าง
Install-Module -Name MicrosoftPowerBIMgmt.Profile
Import-Module MicrosoftPowerBIMgmt.Profile
จากนั้นก็ทำการ Sign in ด้วย account ที่มี Power BI Pro license ที่ต้องการซึ่งก็ support การ sign in account ที่เป็น Multi-Factor Authentication (MFA) ได้ด้วย
Connect-PowerBIServiceAccount
จากนั้นเราก็สามารถ run ตัว REST ของ Power BI API ได้ โดยเอา -Url หลัง /myorg/ อย่างในตัวอย่าง GET
GET https://api.powerbi.com/v1.0/myorg/dashboards
ก็เอาแค่คำว่า dashboard แล้วใช้คำสั่ง Invoke-PowerBIRestMethod
Invoke-PowerBIRestMethod -Url ‘dashboards’ -Method Get
ส่วน POST method อาจจะต้องใส่ในส่วนของ Body ที่เป็น JSON ด้วย อย่างเช่นในกรณีนี้จะ clone เป็น Report ใหม่ชื่ออะไร
POST https://api.powerbi.com/v1.0/myorg/reports/{reportId}/Clone
ซึ่ง JSON body ในกรณีนี้โดยปกติตัว API clone จะใส่ประมาณนี้
{
“name” : “Clone SM report”
}
แต่ใน PowerShell ให้กำหนดเป็น variable ก่อนแล้วใช้คำสั่ง |ConvertTo-JSON หลัง variable
$body = @{ name = “Clone SM report”; } | ConvertTo-Json
ในกรณีมี body หลายบรรทัดก็คั่นด้วย semicolon
จากนั้นค่อย run คำสั่งโดยใส่ reportId ตรง -URL และที่หลัง -Body ก็ใส่ variable ที่เรากำหนด
Invoke-PowerBIRestMethod -Url ‘reports/3e10802e-2884–4855–9a54–3e80040962ce/Clone’ -Method Post -Body $body
ในส่วนรายละเอียดของคำสั่ง Invoke-PowerBIRestMethod สามารถดูเพิ่มเติมได้
ในส่วนนี้ ตัว PowerShell moduleใช้ API version ที่เป็น v1.0 ซึ่งเป็น default version ที่นิ่งและเอาไปใช้ใน Production ในกรณีถ้าไม่มีการกำหนดใน Invoke-PowerBIRestMethod ซึ่งบางตัวถ้ามี version เช่น beta สามารถกำหนดได้ด้วย -version หลังคำสั่ง Invoke-PowerBIRestMethod
ในส่วนของ Header โดย PowerShell จะมี Header เป็น ContentType application/json ให้อยู่แล้วเป็น default สามารถเป็น ContentType และบวก Header อื่นๆได้ โดยกำหนด -ContentType และ -Headers หลังคำสั่ง Invoke-PowerBIRestMethod
สุดท้ายการ update version ของ PowerShell module นี้จะใช้คำสั่ง
Update-Module -Name MicrosoftPowerBIMgmt.Profile
Postman
ของ Postman จะยุ่งยากหน่อยในส่วนของ Authentication และ Permission ไม่เหมือน PowerShell module ที่มีการ Authentication ในตัวอยู่แล้ว
วิธีในตัวอย่างนี้ของ Postmanจะใช้ Bearer Token ในการ Authenticate ซึ่งอาจไม่รองรับ Account ที่เป็น MFA ต้องใช้เป็นวิธี OAuth 2
อันดับแรกทดลองไปที่ Azure AD App Registration ก่อนเพื่อ add ตัว Postman เข้า List โดยใช้ Admin Credential ของ Office 365
https://aad.portal.azure.com/#blade/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/RegisteredApps
จากนั้นไปที่ + New registration ตั้งชื่อแล้วทำการ register โดยไม่ต้องใส่ Redirecrt URL
จากนั้นให้ copy ค่า ClientID, TenantID เก็บไว้
จากนั้นที่แถบซ้ายไปที่ Certificates & secrets ให้สร้าง secrets และ copy เก็บไว้ด้วย
จากนั้นมาที่ API Permission เพื่อ Add Permission ของ Power BI Services ให้เลือกเป็น Deligate permissions
ซึ่ง GET ตัว Dashboard จะใช้ permission ของ Dashboard.Read.All ส่วนของ POST ที่เป็น Clone report จะใช้ Report.ReadWrite.All ซี่งอันอื่นๆสามารถดูได้ว่าต้องการ permission อะไรได้ที่ Power BI API reference หน้านั้นๆ
จากนั้นก็คลิก Grant Admin Consent ให้เรียบร้อย
สร้าง Environment ใหม่โดยกำหนดตัวแปรและใส่ค่า 3 ค่าที่ได้และเพิ่มค่าว่างอีกตัวชื่อ Username, Password และ AccessToken โดย username และ password ก็คือตัว account ของ Power BI Pro ของ user คนนั้น
จากนั้นจะสร้าง POST call อันแรกเพื่อเอา Access Token ของ user คนนั้น
POST https://login.microsoftonline.com/common/oauth2/token
โดยที่ Body ใส่ค่าตามในรูป
ส่วนในแถบ Tests ให้ใส่ code เพื่อที่ response จะได้เก็บ Token ไว้ใน variable
var json = JSON.parse(responseBody);
pm.environment.set(“AccessToken”, json.access_token);
ทดลองคลิก Send เราจะได้ Access Token มาซึ่ง Save เก็บไว้ที่ variable ของ {{AccessToken}} ซึ่งมีอายุไม่นานอาจจะต้องมายิงเพื่อเอา token ใหม่ถ้า expired
ทดลองยิง GET โดยใส่ที่แถบ Authorization เป็น Type ประเภท Bearer Token ก็จะสามารถเห็น Dashboard ของ user คนนี้
ส่วนของ POST ก็ให้ไปใส่ Header กับ Body ก่อน แล้วก็อย่าลืมไปชี้ {{AccessToken}}