首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用tableau Rest查询tableau工作簿

使用tableau Rest查询tableau工作簿
EN

Stack Overflow用户
提问于 2019-07-31 05:23:46
回答 2查看 777关注 0票数 1

我是API编码和工作模块的新手,该模块登录到Tableau并获取存储在站点中的工作簿列表。代码将使用在C#中编写。

我成功地使用Rest登录到Tableau服务器。但是,我无法查询工作簿。下面是我的密码。

代码语言:javascript
复制
class Program
    {
        static HttpClient client = new HttpClient();


        public static string site_id { get; set;}
        public static string token { get; set; }
        static void Main(string[] args)
        {
            CallWebAPIAsync().Wait();
        }

        static async Task CallWebAPIAsync()
        {
            using (var client = new HttpClient())
            {
                client.Timeout = TimeSpan.FromMilliseconds(Timeout.Infinite);
                client.BaseAddress = new Uri("https://my server url.com");
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/xml"));
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/octet-stream"));
                SignIn(client);
                Workbooks(client, site_id, token);
            }

            Console.Read();
        }

        public class CustomXmlMediaTypeFormatter : XmlMediaTypeFormatter
        {
            public CustomXmlMediaTypeFormatter()
            {
                UseXmlSerializer = true;
                WriterSettings.OmitXmlDeclaration = false;
            }
        }
        public static tableauCredentialsType SignIn(HttpClient client)
        {
            var name = "Administrator";
            var password = "password";
            var site = "";

            var tableauCredentialsType = new tsRequest()
            {
                Item = new tableauCredentialsType
                {
                    name = name,
                    password = password,
                    site = new siteType() { contentUrl = site }
                }
            };

            var httpContent = new ObjectContent<tsRequest>(tableauCredentialsType, new CustomXmlMediaTypeFormatter());

            var httpResponseMessage = client.PostAsync("/api/3.2/auth/signin", httpContent).Result;

            if (httpResponseMessage.StatusCode != System.Net.HttpStatusCode.OK)
                throw new Exception(string.Format("Unable to login to the server", site, name));

            var responseLogin = httpResponseMessage.Content.ReadAsAsync<tsResponse>(new List<MediaTypeFormatter>() { new CustomXmlMediaTypeFormatter() }).Result;

            var resultTableauCredentialsType = ((tableauCredentialsType)responseLogin.Items[0]);

            site_id = resultTableauCredentialsType.site.id;

            token = resultTableauCredentialsType.token;

            return resultTableauCredentialsType;

        }

        public static IList<workbookType> Workbooks(HttpClient client, string siteid, string auth_token, int pageSize = 100, int pageNumber =1)
        {
            IList<workbookType> results = new List<workbookType>();

            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("x-tableau-auth", auth_token);
           var query = client.GetAsync(string.Format("/api/3.2/sites/{0}/workbooks", siteid, pageSize, pageNumber)).Result;

            if(query.StatusCode == System.Net.HttpStatusCode.OK)
            {
                var result = query.Content.ReadAsAsync<tsResponse>(new List<MediaTypeFormatter>() { new CustomXmlMediaTypeFormatter() }).Result;

                var pagination = (paginationType)result.Items[0];

                var workbooks = ((workbookListType)result.Items[1]).workbook.AsEnumerable();

                for (int i=2; i < pageNumber; i++)
                {
                    query = client.GetAsync(string.Format("/api/3.2/sites/{0}/workbooks", siteid, pageSize, i)).Result;

                    if(query.StatusCode == System.Net.HttpStatusCode.OK)
                    {
                        result = query.Content.ReadAsAsync<tsResponse>(new List<MediaTypeFormatter>() { new CustomXmlMediaTypeFormatter() }).Result;

                        workbooks = workbooks.Concat(((workbookListType)result.Items[1]).workbook.AsEnumerable());
                    }
                }

                results = workbooks.ToList();
            }

            return results;
        }
    }

当我试图在上面的代码中运行工作簿函数时,我会得到401-未经授权的错误。我认识到,我需要传递X-tableau_auth,以便在查询工作簿时完成身份验证。但是,我没能很好地得到它。

有人能帮我吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-31 07:13:54

可以使用DefaultRequestHeaders Add方法传递标头信息。

你可以尝试这样的方法

代码语言:javascript
复制
client.DefaultRequestHeaders.Add("x-tableau-auth", "tokenvalue");

此外,api参数也不正确。您可以参考Tableau提供的API指南。

票数 0
EN

Stack Overflow用户

发布于 2019-07-31 06:00:14

您检查了用于获取工作簿列表的Url吗?我查看了Tableau的API文档,Url格式看起来不同,尝试更新您的代码

代码语言:javascript
复制
string.Format("/api/{0}/sites/site-id/workbooks", siteid, pageSize, i)

代码语言:javascript
复制
string.Format("/api/3.4/sites/{0}/workbooks", siteid)

在这里,我假设您使用的是3.4VersionAPI。

我还建议在编写代码之前使用一些Rest客户端来测试这些应用程序。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57283735

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档