我正在使用带有 Python 3 的 SSRS API,需要获取所有报告及其订阅。
https://app.swaggerhub.com/apis/microsoft-rs/SSRS/2.0#/info
from requests_negotiate_sspi import HttpNegotiateAuth
import requests
req_url = r'http://<my_server_url>/reports/api/v2.0/Subscriptions'
session = requests.Session()
session.auth = HttpNegotiateAuth()
report_response = session.get(req_url, stream=True)
report_response_json = report_response.json()
session.close()
# do stuff with json response, eventually export to CSV
这可以让我获得我创建并发布的报告所需的所有信息。但是,服务器上有其他用户发布的报告,我也希望能够获取他们的报告信息。
似乎
/CatalogItems
返回所有内容,因此新的工作流程是使用该端点,然后循环遍历每个项目。然后使用响应中每个项目的 ID 发出另一个获取请求。
api_url = r'http://<my_server>/reports/api/v2.0/'
# single-sign on
session = requests.Session()
session.auth = HttpNegotiateAuth()
# use Odata filtering to only get Reports and LinkedReports
# https://docs.oasis-open.org/odata/odata/v4.0/odata-v4.0-part1-protocol.html#_Toc445374625
report_response = session.get(api_url + r"CatalogItems?%24filter=Type%20eq%20'Report'%20or%20Type%20eq%20'LinkedReport'") #, params = {'filter': 'Type eq "Report" or Type eq "LinkedReport"'})
report_response_json = report_response.json()
for report_item in report_response_json['value']:
try:
# documentation doesn't list the LinkedReport(Id)/Subscriptions endpoint,
# but it exists just like the Report(Id)/Subscriptions one
# https://app.swaggerhub.com/apis/microsoft-rs/SSRS/2.0#/LinkedReports/GetLinkedReports
subscription_request_response = session.get(api_url + report_item['Type'] + 's(' + report_item['Id'] + ')/Subscriptions')
subscription_item = subscription_request_response.json()['value']
if(len(subscription_item) == 0): # no subscriptions
# do stuff
else: # report has subscriptions
subscription_item = subscription_item[0] # single item list of lists
# do other stuff
except:
# log error, do other stuff
session.close()