การ Call ตัว Power BI REST API ผ่าน Windows PowerShell/Postman

Narisorn Limpaswadpaisarn
EchoO365
Published in
5 min readDec 24, 2020

Content difficulty — Technical

Logo: PowerShell, Postman และ Power BI

จากตอนที่แล้ว มีเกริ่นๆบ้างในเรื่องของการใช้ 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

ไปที่ report นั้นๆเพื่อเอา reportId

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

ทำการ Install/Import และ sign in

จากนั้นเราก็สามารถ 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

Result โชว์ออกมา 2 Dashboards
เห็น Dashboard ทั้งหมด 2 อันตามใน portal จริง

ส่วน 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

PowerShell ด้วย POST method
Report ถูก clone สำเร็จตามชื่อใน 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

App registration

จากนั้นไปที่ + New registration ตั้งชื่อแล้วทำการ register โดยไม่ต้องใส่ Redirecrt URL

App registration

จากนั้นให้ copy ค่า ClientID, TenantID เก็บไว้

ClientID และ TenantID

จากนั้นที่แถบซ้ายไปที่ Certificates & secrets ให้สร้าง secrets และ copy เก็บไว้ด้วย

App secrets

จากนั้นมาที่ 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 ให้เรียบร้อย

Add API Permission
เมื่อ Add permission ครบให้ Grant Consent

สร้าง Environment ใหม่โดยกำหนดตัวแปรและใส่ค่า 3 ค่าที่ได้และเพิ่มค่าว่างอีกตัวชื่อ Username, Password และ AccessToken โดย username และ password ก็คือตัว account ของ Power BI Pro ของ user คนนั้น

Environment

จากนั้นจะสร้าง POST call อันแรกเพื่อเอา Access Token ของ user คนนั้น

POST https://login.microsoftonline.com/common/oauth2/token

โดยที่ Body ใส่ค่าตามในรูป

Get Access Token

ส่วนในแถบ Tests ให้ใส่ code เพื่อที่ response จะได้เก็บ Token ไว้ใน variable

var json = JSON.parse(responseBody);

pm.environment.set(“AccessToken”, json.access_token);

Tests

ทดลองคลิก Send เราจะได้ Access Token มาซึ่ง Save เก็บไว้ที่ variable ของ {{AccessToken}} ซึ่งมีอายุไม่นานอาจจะต้องมายิงเพื่อเอา token ใหม่ถ้า expired

Access Token

ทดลองยิง GET โดยใส่ที่แถบ Authorization เป็น Type ประเภท Bearer Token ก็จะสามารถเห็น Dashboard ของ user คนนี้

ส่วนของ POST ก็ให้ไปใส่ Header กับ Body ก่อน แล้วก็อย่าลืมไปชี้ {{AccessToken}}

Content-Type เป็น application/json
ทดลองยิง POST จะเห็น Status: 200 OK
Report ถูก clone มาสำเร็จ

--

--

Narisorn Limpaswadpaisarn
EchoO365

Office 365 and Modern Workplaces: Please follow my publication https://medium.com/echoo365 for Microsoft 365 & Power Platform Blog (In Thai)