【问题标题】:Query tableau workbooks using tableau Rest API使用 tableau Rest API 查询 tableau 工作簿
【发布时间】:2019-12-08 13:24:16
【问题描述】:

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

我能够使用 Rest API 成功登录到 Tableau Server。但是,我无法查询工作簿。下面是我的代码。

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;
        }
    }

当我尝试在上述代码中运行 Workbooks 函数时,我收到 401-Unauthorized 错误。我知道我需要通过 X-tableau_auth 以便在查询工作簿时完成身份验证。但是,我无法正确获取。

谁能帮我解决这个问题?

【问题讨论】:

    标签: c# rest tableau-api


    【解决方案1】:

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

    你可以试试

    client.DefaultRequestHeaders.Add("x-tableau-auth", "tokenvalue");
    

    还有api参数不正确。可以参考Tableau提供的API指南

    【讨论】:

      【解决方案2】:

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

      string.Format("/api/{0}/sites/site-id/workbooks", siteid, pageSize, i)
      

      string.Format("/api/3.4/sites/{0}/workbooks", siteid)
      

      这里我假设你使用的是 3.4 版本的 api。

      我还建议您在编写代码之前使用一些 Rest Client 来测试这些 API。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-10
        • 2021-11-25
        • 2021-11-04
        • 2018-02-21
        • 1970-01-01
        • 2021-07-05
        相关资源
        最近更新 更多