人生没有彩排
每一天都是现场直播

通过REST API刷新PowerBI报表

PowerBI Server上提供的计划刷新功能很方便,但也有一定的限制,比如刷新次数最大为每天48次,而这还是需要Premium许可的情况下才拥有的刷新次数,如果只是Pro许可,那么刷新次数就只有每天8次。此外,计划刷新时是刷新整个数据集的,此时可能只是部分表的数据有变化,但仍然刷新了所有表,增加了不必要的刷新时间。虽然有这些限制,但一般来说,计划刷新功能已经足够使用。

但如果想突破最大刷新次数或只刷新数据集中的部分表,那么可以通过REST API的方式来进行刷新,使用REST API的增强型刷新可以只刷新数据集中的部分表,并且可以突破每天48次的刷新次数,但这需要Premium许可才行,Pro许可的刷新次数仍然被限制在每天8次。

另外,当对数据的实时性有一定要求时,也经常使用REST API来进行刷新,比如该常见场景:当数据库的数据更新后就同步最新数据到PowerBI报表上。由于数据库的数据更新可能具有不确定性,此时采用计划刷新将使PowerBI报表上的数据存在延时,因此在该场景下通常是把刷新报表的操作嵌入到ETL的某个环节中,从而需要使用到REST API。

调用REST API刷新报表

PowerBI的REST API有很多,这里只介绍刷新报表所用到的API,若对其它API感兴趣,可以自行浏览官方文档:了解 Power BI REST API


API接口:

Url:https://api.powerbi.com/v1.0/myorg/groups/{groupId}/datasets/{datasetId}/refreshes      # Global
Url:https://api.powerbi.cn/v1.0/myorg/groups/{groupId}/datasets/{datasetId}/refreshes       # 21Vianet

Method:POST
Request Headers: {Authorization:访问令牌, Content-Type:application/json}

1、默认刷新整个数据集:
Request Body = {}

2、增强型刷新,可刷新部分表
Request Body = 
    {
        "type": "full",
        "commitMode": "transactional",
        "maxParallelism": 2,
        "retryCount": 2,
        "objects": [
            {"table": "tableName1"},
            {"table": "tableName2"}
        ]
    }

参数说明:

1. 访问令牌

关于获取访问令牌的具体步骤与原理,请参考我的另一篇文章:Azure应用注册与访问令牌获取,并从该文章末尾处复制给出的现成代码,然后填写相关参数即可。注意:需要给Azure应用授予PowerBI Services的Dataset.ReadWrite.All权限。

2. groupId与datasetId

groupId与datasetId为需要刷新的报表所关联的数据集所在的工作区ID与数据集ID,一般来说报表与数据集都是位于同一工作区的,但如果报表与数据集分别位于不同的工作区时就需要注意,使用的是数据集所在的工作区的ID。

可以打开报表所关联的数据集,然后从浏览器上方地址栏处获取这两个ID,具体如下图所示:

3. Request Body

该参数为调用API时的请求体参数,通过它可以更细致的控制刷新时的行为,比如指定只刷新某几个表,以及刷新失败是否有邮件通知,失败后重新尝试多少次等等。如果采用默认的刷新策略,那么将该参数设置为:{} 即可。如果想要刷新某几个表,那么可以设置为:

{
    "type": "full",
    "commitMode": "transactional",
    "maxParallelism": 2,
    "retryCount": 2,
    "objects": [
        {"table": "tableName1"},
        {"table": "tableName2"}
        ...
    ]
}

以上只是简单的举例,关于Request Body的更多信息与说明,请见官方文档


当所有参数都获取到后,就可以调用该REST API刷新报表了。以Python为例,调用REST API刷新报表的代码如下:

def refresh_pbi_dataset(ENVIRONMENT_TYPE,TOKEN,WORKSPACE_ID,DATASET_ID,REQUEST_BODY={}):
    # refresh pbi dataset and return refresh status
    if ENVIRONMENT_TYPE.lower() not in ['global','21vianet']:
        return 404

    apiRootUrl = 'https://api.powerbi.com/v1.0/myorg/groups/' if ENVIRONMENT_TYPE.lower()=="global" else 'https://api.powerbi.cn/v1.0/myorg/groups/'
    refresh_api = apiRootUrl + WORKSPACE_ID + '/datasets/' + DATASET_ID + '/refreshes'
    response = requests.post(refresh_api, headers={'authorization':TOKEN},json=REQUEST_BODY)
    return response.status_code

# Refreash Entire Dataset:
result = refresh_pbi_dataset(ENVIRONMENT_TYPE,TOKEN,WORKSPACE_ID,DATASET_ID)

# Refreash some tables in Dataset:
REQUEST_BODY = {
    "type": "full",
    "commitMode": "transactional",
    "maxParallelism": 2,
    "retryCount": 2,
    "objects": [
        {"table": "tableName1"},
        {"table": "tableName2"}
    ]
}
result = refresh_pbi_dataset(ENVIRONMENT_TYPE,TOKEN,WORKSPACE_ID,DATASET_ID,REQUEST_BODY)

注意事项

1、服务主体API访问

在获取访问令牌时,若选择使用服务主体模式,则必须在PowerBI Service的门户管理中打开服务主体API访问的功能,若只使用主用户模式,则不用打开该功能。

2、工作区的访问权限

获取访问令牌时无论是使用主用户模式还是服务主体模式,都需要给相应的主用户或服务主体授予工作区的访问权限。具体的权限级别视情况而定,比如刷新报表就需要参与者或以上权限,如果是共享报表那就需要成员或以上权限,因此建议授予成员或管理员权限是比较好的。

给工作区添加权限时,如果添加的是服务主体,则使用Azure应用的名称进行搜索并添加;如果添加的是主用户,则使用主用户的名称或邮箱进行搜索并添加。

完整的实现代码

为方便使用,下面给出从获取访问令牌到调用REST API刷新PowerBI报表的完整实现代码,有多个版本,可自选其一,均支持国际版与世纪互联两个环境,且可以选择使用主用户或服务主体模式,只需要填写相应参数即可。

此内容查看价格为10积分立即购买
登录后,购买的内容长期有效,不受时间限制。
赞(0) 打赏
版权声明:本文为夕枫的原创文章,著作权归作者所有,未经允许不得转载
文章名称:《通过REST API刷新PowerBI报表》
文章链接:https://www.ximaple.com/posts/611.html
订阅评论
提醒
guest
0 评论
最新
最久 最赞
内联反馈
查看所有评论

觉得文章有用的话就支持一下吧~

感谢您的打赏支持,我将持续输出有价值的内容!

支付宝扫一扫

微信扫一扫

登录

找回密码

注册

Operation don't support