使用Python对BI REST API进行身份验证时出现问题

使用Python对BI REST API进行身份验证时出现问题,python,rest,api,powerbi,Python,Rest,Api,Powerbi,我已经创建了一个推送流数据集(history on),并使用“推送URL”(push URL)从Python脚本向其发布数据,该URL是我从相关数据集的API信息选项卡获得的。我还需要做的是删除历史数据,以便清除我的测试数据和/或能够重置数据集,并在必要时从头开始重新填充 推送Url的格式为https://api.powerbi.com/beta/xxxxxxxx/datasets/xxxxxxxxxxxx/rows?key=xxxxxxxxxxxxxxx 以下代码工作正常,数据已发布 impo

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

推送Url的格式为
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身份验证,认为authURL可能只用于发布数据。在“我的代码”处注册应用程序后,现在看起来如下所示:

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。帖子返回401(这与前面的方法相同),删除仍然返回404。

多亏jonrsharpe为我指明了正确的方向

重温API文档时,我发现了一个获取表名的调用

获取{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"
一切都很完美


谢谢你,乔恩

您是否查看了API文档以了解支持哪些端点和方法?如果是身份验证问题,您将得到401或403,而不是404。也就是说,我希望405来自一个存在但不支持特定方法的端点,因此API的格式可能不是特别好。Jon,您可能走对了方向,因为身份验证post确实返回了成功。但是端点是相同的;删除{datasetKey}/tables/{tableName}/行和POST{datasetKey}/tables/{tableName}/行。当然,它们可能都是错误的,但我尝试了几种变体,但都没有成功。希望有这些特定API调用经验的人能够提供一些工作示例。我应该补充的是,我基于原始的“Push url”构建了enpoint url,但删除了“key=”部分。文档中的URL略有不同,并提到{tablename}。我不知道从哪里获得这段信息,所以如果有人知道我在哪里可以找到它,我可以尝试相应地更新端点URL。