如何使用GraphQL查询查询Tableau元数据API?

2024-04-19 10:08:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我能够使用RESTAPI很好地登录(没有证书验证)。然而,当我查询元数据API时,我得到的只是来自graphQL GUI的html/javascript。没有人知道如何正确设置查询以检索与/metadata/graphQL上GUI中显示的相同信息

这是我要登录的代码:

import requests import json url = "https://<tableau-server-name>/api/3.8/auth/signin" payload = json.dumps({ "credentials": { "personalAccessTokenName": "<my login token>", "personalAccessTokenSecret": "<my token value>", "site": { "contentUrl": "" } } }) headers = { 'Accept': 'application/json', 'Content-Type': 'application/json' } response = requests.request("POST", url, headers=headers, data=payload, verify=False) response = json.loads(response.text) print(response) site_id = response['credentials']['site']['id'] user_id = response['credentials']['user']['id'] token = response['credentials']['token'] headers['X-tableau-auth']=token

我得到了一个很好的json响应,带有授权令牌,可以传递给后续调用:

{'credentials': {'site': {'id': '<site-id>', 'contentUrl': ''}, 'user': {'id': '<my-user-id>'}, 'token': '<my-user-token>'}}

我对元数据api的下一次调用是从这里开始的:

import requests import json url = "https://<tableau-server-name>/metadata/graphql/" payload="{\"query\":\"query getAllTables {\\r\\n workbooks (filter: {id: \\\"<workbook id>"\\\"}) {\\r\\n\\t\\tname\\r\\n dashboards {\\r\\n id\\r\\n name\\r\\n sheets {\\r\\n id\\r\\n name\\r\\n \\tdatasourceFields {\\r\\n id \\r\\n name\\r\\n __typename\\r\\n ...on CalculatedField {\\r\\n formula\\r\\n }\\r\\n }\\r\\n }\\r\\n }\\r\\n }\\r\\n}\",\"variables\":{}}" headers = { '\'X-tableau-auth\'': token, 'Accept': 'application/json', 'Content-Type': 'application/json' } response = requests.request("GET", url, headers=headers, data=payload) print(response.text)

答复是:

<!DOCTYPE html> <html xmlns:ng="" xmlns:tb=""> <head ng-csp> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="initial-scale=1, maximum-scale=2, width=device-width, height=device-height, viewport-fit=cover"> <meta name="format-detection" content="telephone=no"> <meta name="vizportal-config" data-buildId="2020_2_164_widw5sl5zoo" data-staticAssetsUrlPrefix=""> <link href="vendors-vizportal.css?c5da2e24bb179cf9a5dd" rel="stylesheet"> <link href="vizportal.css?c5da2e24bb179cf9a5dd" rel="stylesheet"> <script type="text/javascript" src="/javascripts/api/tableau-2.min.js?c5da2e24bb179cf9a5dd"></script> <script type="text/javascript" src="jquery.min.js?c5dasdfasdfcf9a5dd"></script> <script type="text/javascript" src="angular.min.js?cadfasdff9a5dd"></script> <script type="text/javascript" src="angular-cookies.min.js?cadfasdfsacf9a5dd"></script> <script type="text/javascript" src="angular-sanitize.min.js?casdfasdfasdfb179cf9a5dd"></script> <script type="text/javascript" src="rsa.js?c5da2easdfasdfasfasdfdd"></script> <script type="text/javascript" src="underscore-min.js?adfasghdfhfdgdfacf9a5dd"></script> <script type="text/javascript" src="q.min.js?casdfdsfa9a5dd"></script> <script type="text/javascript" src="canvas-to-blob.min.js?c5sdfasdfasdfafa5dd"></script> <script type="text/javascript" src="js.cookie.js?c5adsfasdf9a5dd"></script> <script type="text/javascript" src="mousetrap.js?c5djdfghjrhfcff9a5dd"></script> <script type="text/javascript" src="core.min.js?c5dahkfghjfghj9a5dd"></script> <script type="text/javascript" src="vendors-vizportal.js?c5da2e24bwtertcf9a5dd"></script> <script type="text/javascript" src="vizportal.js?c5da2e2dfghdfgha5dd"></script> </head> <body class="tb-body"> <div class="tb-app" ng-app="VizPortalRun" id="ng-app" tb-window-resize> <tb:app></tb:app> <tb:react-toaster></tb:react-toaster> <script type="text/ng-template" id="inline_stackedElement.html"> <div class="tb-absolute" tb-window-resize tb-left="left" tb-top="top" tb-right="right" tb-bottom="bottom" tb-visible="visible" tb-overflow-y="overflowY"></div> </script> <tb:stacked-elements></tb:stacked-elements> </div> </body>

相比之下,我希望查询返回json,并对我在graphql GUI中测试的graphql查询做出相应的响应

我正在运行的graphQL查询如下:

query getAllFields { workbooks (filter: {id: "<workbook-id>"}){ embeddedDatasources { fields { id name ...on CalculatedField{ formula } } name id } } }

Tags: textnamesrctokenidjsonresponsetype