Я создал набор данных для потоковой передачи (история включена), и мне удалось опубликовать в нем данные из скрипта 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.