如何将Tableau Server中的视图嵌入web页面

简介: 如何将Tableau Server中的视图嵌入web页面

Tableau作为可视化数据分析软件中的佼佼者,将数据运算与美观的图表完美地嫁接在一起。它的程序很容易上手,各公司可以用它将大量数据拖放到数字“画布”上,转眼间就能创建好各种图表。创建与共享绝妙的数据可视化内容,Tableau 为您呈上唾手可得的可视化分析能力。它帮助您生动地分析实际存在的任何结构化数据,以在几分钟内生成美观的图表、坐标图、仪表盘与报告。利用 Tableau 简便的拖放式界面,您可以自定义视图、布局、形状、颜色等等,帮助您展现自己的数据视角。另外他还适用于多种数据文件与数据库,数据可扩展性强,不限制您所处理的数据大小。

首先讲一下我们今天用到的Tableau的模块吧:tableau desktop 是用来创建分析,进行数据分析的,是分析工具。tableau server 是用来发布分析的,发布给企业相关权限的人,是服务器。

接下来就让我们了解一下tableau嵌入视图的原理吧。

image.png

1、客户端请求数据:当用户访问具有嵌入式 Tableau Server 视图的网页时,该客户端会向 Web 服务器发送请求,要求返回页面地址。

2、Web 服务器请求Tableau Server:Web 服务器向受信任的 Tableau Server发送请求。该请求必须有一个 username 参数。username 值必须是 Tableau Server 许可用户的用户名。如果 Tableau Server 承载多个站点,且视图在默认站点之外的其他站点上,则 POST 请求还必须包含 target_site 参数。

3、Tableau Server 创建票证:Tableau Server 检查发送请求的 Web 服务器的 IP 地址或主机名。如果 Web 服务器作为受信任主机列出,则 Tableau Server 将以唯一字符串的形式创建一个票证。票证必须在发出后三分钟内兑换。Tableau Server 使用该票证来响应 POST 请求。或者,如果存在错误并且无法创建票证,则 Tableau Server 将使用值 -1 进行响应。

4、Web 服务器将 URL 传递给客户端:Web 服务器将为视图构建 URL,并将其插入网页的 HTML 中。Web 服务器将 HTML 传递回客户端的 Web 浏览器。

5、客户端向Tableau Server 请求视图:客户端 Web 浏览器将向 Tableau Server 发送一个请求,该请求包括带有票证的 URL。

6、Tableau Server 兑换票证:Tableau Server 兑换票证,创建会话,将用户登录,从 URL 中移除票证,然后将嵌入视图的最终 URL 发送到客户端。

最后让抛出重要的代码来讲解一下:

服务端代码:

public String index(){
   PropertiesUtils props = PropertiesUtils.getInstance();
   //tableau server服务器地址
   final String wgserver = props.getProperty("tableau.server.location");
   //Tableau Server 许可用户的用户名
   final String tableAuUser = props.getProperty("tableau.user");
   String ticket;
   String tickUrl = "";
   try {
       ticket = TableauHelper.getTrustedTicket(wgserver, tableAuUser);
       if ( !ticket.equals("-1") ) {
           tickUrl = "http://" + wgserver + "/trusted/" + ticket + "/view/names";
      }
  } catch (ServletException e) {
       logger.error("获取tableau ticket 失败。 ",e);
  }
   setAttr("tickUrl",tickUrl);
   render("tableau.html");
}
//获取票证逻辑
public static String getTrustedTicket(String wgserver, String user)
   throws ServletException {
OutputStreamWriter out = null;
BufferedReader in = null;
try {
StringBuilder reqUrl = new StringBuilder();
reqUrl.append(URLEncoder.encode("username", "UTF-8"));
reqUrl.append("=");
reqUrl.append(URLEncoder.encode(user, "UTF-8"));
URL url = new URL("http://" + wgserver + "/trusted");
URLConnection conn = url.openConnection();
conn.setDoOutput(true);
out = new OutputStreamWriter(conn.getOutputStream());
out.write(reqUrl.toString());
out.flush();
StringBuilder rsp = new StringBuilder();
in = new BufferedReader(
new InputStreamReader(conn.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
rsp.append(line);
}
return rsp.toString();
} catch (Exception e) {
throw new ServletException(e);
} finally {
try {
if (in != null)
in.close();
if (out != null)
out.close();
} catch (IOException e) {
}
}
}

前台代码

<!DOCTYPE html>
<html>
<head>
   <title>tableau页面</title>
   <script type="text/javascript"
           src="https://public.tableau.com/javascripts/api/tableau-2.min.js"></script>
   <script type="text/javascript">
       function initViz() {
           var containerDiv = document.getElementById("vizContainer");
           var url = document.getElementById("tickUrl").value;
           options = {
               hideTabs: true,
               //隐藏底部所有按钮
               //hideToolbar:true,
               onFirstInteractive: function () {
                   console.log("Run this code when the viz has finished loading.");
              }
          };
           var viz = new tableau.Viz(containerDiv, url, options);
      }
   </script>
</head>
<body onload="initViz();">
<div id="vizContainer">
</div>
<input id="tickUrl" type="hidden" value="${tickUrl}">
</body>
</html>

这样我们就完成了将tableau server中的视图嵌入自己的页面中。

Tableau JavaScript API:https://onlinehelp.tableau.com/current/api/js_api/en-us/JavaScriptAPI/js_api.htm

Tableau Server获取票证:https://onlinehelp.tableau.com/current/server/zh-cn/trusted_auth_webrequ.htm

Tableau编写嵌入代码:https://onlinehelp.tableau.com/current/pro/desktop/zh-cn/embed_code.htm

嵌入代码的参数:https://onlinehelp.tableau.com/current/pro/desktop/zh-cn/embed_list.htm

在这里再说几个参数吧

:alerts(values为yes或者no):隐藏工具栏中的“通知”按钮,该按钮使用户能创建数据驱动型通知。

:customViews(values为yes或者no):隐藏工具栏中的“视图”按钮,该按钮使用户能保存自定义视图。

:showShareOptions(values为true或者false):控制是否在嵌入视图中显示“共享”选项。

:device(values为desktop、tablet、phone):屏幕大小及布局属性。


相关文章
|
1月前
|
编解码 前端开发 JavaScript
使用 CSS 打印样式为 Web 页面设置专业的打印机效果
使用 CSS 打印样式为 Web 页面设置专业的打印机效果
52 2
|
22天前
|
前端开发 开发者
WEB自定义页面请求响应
Web组件支持在应用拦截到页面请求后自定义响应请求能力。开发者通过onInterceptRequest()接口来实现自定义资源请求响应 。自定义请求能力可以用于开发者自定义Web页面响应、自定义文件资源响应等场景。
23 0
|
1月前
|
网络协议 Windows
Windows Server 2019 Web服务器搭建
Windows Server 2019 Web服务器搭建
|
2月前
|
存储
在 Web 中判断页面是不是刷新
【9月更文挑战第10天】在Web开发中,判断页面是否刷新有多种方法:1) 监听`popstate`事件,检测用户是否通过历史记录访问页面;2) 记录并比较页面加载时间戳,若相差极小,则可能为刷新;3) 利用本地存储设置特定值,若该值不存在或不符合预期,则页面可能被刷新。然而,这些方法并非绝对准确。
169 3
html,web页面朗读文字,朗读中文,朗读英文
html,web页面朗读文字,朗读中文,朗读英文
|
2月前
|
数据处理 Python
Django视图:构建动态Web页面的核心技术
Django视图:构建动态Web页面的核心技术
|
3月前
|
开发者 前端开发 Apache
Apache Wicket Ajax揭秘:轻松几步,让你的Web应用告别“呆板”,焕发新生!
【8月更文挑战第31天】随着互联网技术的发展,Web应用的交互性成为评价网站成功的关键指标。Apache Wicket作为一款卓越的Java Web框架,不仅具备强大的组件化开发能力,还内置了对Ajax技术的支持,使开发者能轻松提升Web应用的交互体验。通过简单的代码示例展示了如何在不刷新页面的情况下异步更新页面元素,极大提升了用户体验。Wicket提供了多种Ajax组件和行为,如AjaxFallbackLink、AjaxButton等,满足不同场景需求,并支持自定义Ajax行为,帮助开发者实现复杂交互效果。合理运用Wicket的Ajax功能,可显著增强网站竞争力。
41 0
|
1月前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
102 3
|
19天前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
109 45
|
14天前
|
前端开发 API 开发者
Python Web开发者必看!AJAX、Fetch API实战技巧,让前后端交互如丝般顺滑!
在Web开发中,前后端的高效交互是提升用户体验的关键。本文通过一个基于Flask框架的博客系统实战案例,详细介绍了如何使用AJAX和Fetch API实现不刷新页面查看评论的功能。从后端路由设置到前端请求处理,全面展示了这两种技术的应用技巧,帮助Python Web开发者提升项目质量和开发效率。
30 1