Проблема аутентификации в Power BI REST API с помощью Python - PullRequest
0 голосов
/ 06 января 2019

Я создал набор данных для потоковой передачи (история включена), и мне удалось опубликовать в нем данные из скрипта Python, используя «Push URL», который я получил на вкладке «Информация API» для рассматриваемого набора данных. Что мне также нужно сделать, это удалить исторические данные, чтобы очистить мои тестовые данные и / или иметь возможность сброса набора данных и повторного заполнения с нуля, как и когда это необходимо.

Url Push имеет вид 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, думая, что, возможно, 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 голосов
/ 06 января 2019

Спасибо Джонршарпу, который указал мне правильное направление.

Возвращаясь к документации API, я обнаружил вызов, чтобы получить имена таблиц;

GET https://api.powerbi.com/v1.0/myorg/datasets/{datasetKey}/tables

поэтому после аутентификации я побежал;

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"

и все отлично работает.

Спасибо, Джон!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...