使用Python验证Power BI REST API时出现问题

时间:2019-01-06 16:56:44

标签: python rest api powerbi

我已经创建了一个推送流数据集(历史记录已建立),并且使用“ Push URL”(我从相关数据集的“ API信息”选项卡中获取)从Python脚本向其发布数据。我还需要做的是删除历史数据,以便清除我的测试数据和/或能够根据需要重置数据集并从头开始重新填充。

推送网址的格式为https://api.powerbi.com/beta/xxxxxxxx/datasets/xxxxxxxxxxxx/rows?key=xxxxxxxxxxxxxxx

以下代码可以正常工作并发布数据;

import requests 
import pyodbc as db
import pandas as pd

API_ENDPOINT = "https://api.powerbi.com/beta/xxxxxxxx/datasets/xxxxxxxxxxxx/rows?key=xxxxxxxxxxxxxxx"

dbcon = db.connect('DRIVER={SQL Server};SERVER=tcp:fxdb.database.windows.net;DATABASE=FXDatabase;UID=xxxx;PWD=xxxx')
df = pd.read_sql("select statement etc...", dbcon)
data = df.to_dict(orient='records')

response = requests.post(API_ENDPOINT, json=data)

但是添加这个:

response = requests.delete(API_ENDPOINT)

给我:

404

{
  "error":{
    "code":"","message":"No HTTP resource was found that matches the request URI 'http://api.powerbi.com/beta/...

我无法弄清楚这一点,所以我开始研究OAuth2身份验证,认为Auth URL仅用于 来发布数据。在https://dev.powerbi.com/apps注册应用后,我的代码现在如下所示:

import requests 
import pyodbc as db
import pandas as pd

API_ENDPOINT = "https://api.powerbi.com/beta/xxxxxxxxxxxxxx/datasets/xxxxxxxxxxxxxxx/rows"

data = {
        'grant_type': 'password',
        'scope': 'openid',
        'resource': r'https://analysis.windows.net/powerbi/api',
        'client_id': 'xxxxxxxxx',
        'username': 'xxxxxxxxx',
        'password': 'xxxxxxxx'
    }
response = requests.post('https://login.microsoftonline.com/common/oauth2/token', data=data)

access_token = response.json().get('access_token')
headers = {'Authorization': 'Bearer ' + access_token}

dbcon = db.connect('DRIVER={SQL Server};SERVER=tcp:fxdb.database.windows.net;DATABASE=FXDatabase;UID=xxxx;PWD=xxxx')
df = pd.read_sql("select statement etc...", dbcon)
data = df.to_dict(orient='records')

response = requests.post(API_ENDPOINT, json=data, headers=headers)

response = requests.delete(API_ENDPOINT, headers=headers)

身份验证有效,返回状态码200。POST返回401(与以前的方法一起使用),而DELETE仍返回404。

1 个答案:

答案 0 :(得分:0)

感谢jonrsharpe向我指出了正确的方向。

重新访问API文档时,我发现了一个获取表名称的调用;

获取https://api.powerbi.com/v1.0/myorg/datasets/ {datasetKey} /表

所以我通过身份验证后就跑了;

response = requests.get("https://api.powerbi.com/v1.0/myorg/datasets/xxxxxxxx/tables", headers=headers)

响应的内容告诉我,我的数据集中有一个名为“ RealTimeData”的表,该表必须为默认名称,因为我没有有意创建此表。

我现在已将端点更新为;

API_ENDPOINT = "https://api.powerbi.com/v1.0/myorg/datasets/xxxxxxxxx/tables/RealTimeData/rows"

一切正常。

谢谢乔恩!