Cognos Mashup Service (CMS) 是一种新的 Web 服务,它构成了 IBM Cognos Software Development Kit 的一部分。本文将介绍 CMS 并解释它的两个不同接口:REST 和 SOAP。本文通过提供样例代码并着重介绍其中一些随 Cognos Mashup Service 一起安装的样例,向您展示使用该服务可以完成的部分任务。要充分利用本文介绍的内容,您应当具备 IBM Cognos 8 Business Intelligence (BI) 的基本知识,并对编程语言和 Web 技术有一个基本的了解。
要执行本文给出的示例,您需要安装以下软件:
- IBM Cognos 8.4.1 BI
- IBM Cognos 8.4.1 Software Development Kit
IBM Cognos Mashup Service 提供了一种帮助您集成 Cognos 报告和其他应用程序的方法。可以使用以下两个接口的其中之一来实现这种集成:
- Representational State Transfer (REST)。此接口使用基本的 HTTP 请求。
- Simple Object Access Protocol (SOAP)。此接口可以被用来通过编程的方式访问 CMS API。
下面的示例演示了一个完成的 CMS 集成。图 1 展示了样例 IBM Cognos 8.4.1 Report Studio 报告的一部分。该报告包含一家虚拟公司的销售收入数据。这些数据根据该公司的每个分公司的所在地进行划分。图 2 展示了将该报告集成到 Google Earth 地图后的结果。每个分公司的销售数据按照其地理位置被附加到地图上。所有这一切都是通过 Google Maps API 和 CMS REST 接口完成的。
注意:本文的目的是提供对 CMS 的介绍性的概览,而不涉及如何使用 Google Maps API 的具体细节。
图 1. HTML 格式的样例 IBM Cognos 报告结果
图 2. 使用 IBM Cognos Mashup Service 将 IBM Cognos 报告结果附加在 Google Earth 上
CMS 和 Cognos Software Development Kit (SDK) 有何不同?
表 1 比较了 Cognos SDK 和 CMS。
表 1. 比较 Cognos SDK 和 CMS
| SDK | CMS | |
|---|---|---|
| 报告编写 | 支持编写报告 | 不支持编写报告 |
| 编程语言 | Java®、.NET Languages、VB | Java、.Net Languages、REST 接口 |
| 输出格式 | CSV、HTML、HTML Fragment、MHT、PDF、单一 XLS、spreadsheet ML、XHTML、XLS、XLWA、XML | LDX、XML、HTML、HTML Fragment、JSON 注意:LDX 表示 Layout Data XML。这是一种新格式。 |
| 主要功能 | 除自动化操作外,Cognos Connection 几乎可以完成所有任务 | 运行并获得报告输出,并支持以最小的粒度级别访问报告输出元素 |
| 身份验证 | 支持 | 支持 — 通过 SDK 或自有的身份验证服务,对于 REST,也可以使用 Cognos 8 登录。 |
| API | Java:sdk 文件夹中的 Jar 文件,Microsoft® .Net:sdk 文件夹中的 .dll 文件 | 使用 WSDL 文件,通过 Web 服务消费可用的功能 |
本节提供的示例演示了如何使用 REST 和 SOAP 接口提取 Cognos 报告中的不同组件。
REST 请求的通用 URL 是:
http://webservername:portnumber/cognos8/cgi-bin/cognos.cgi/rds/resource_type/source_type/source_id?option1=val1&option2=val2...
表 2 展示了 REST API 的主要构件。
表 2. REST API 的主要构件
| 资源类型 | 源类型 | 选项 |
|---|---|---|
| auth/logon | conversationID | async |
| auth/logoff | path | burstID |
| atom | report | burstKey |
| promptPage | searchPath | contextId |
| reportData | direction |
有关更多信息(包括其他选项),请参考 Mashup Services Developer Guide(参见 参考资料 小节,找到有关获得该指南的细节)。
REST 示例 1:
第一个 REST API 示例演示了如何从一个同时包含列表和图表的报告中提取出所有图表。该示例以 Layout Data XML (LDX) 格式返回报告中的所有图表。
下面的参数用于构建该示例的 URL:
- 资源类型:
reportData - 源类型:
report - Resource_id:报告存储 id;例如,
iE0CDFEF149F8408F96F1C27DCFFA6BCB - 选项:
fmt=layoutDataXML、xpath=//chart
URL 本身类似如下所示:
http://localhost/c841/cgi-bin/cognos.cgi/rds/reportData/report/iE0CDFEF149F8408F96F1C27DCFFA6BCB?fmt=layoutDataXML&xpath=//chart
清单 1 展示了生成的 LDX。
清单 1. 样例 REST 调用生成的 LDX
<filterResultSet xmlns="http://www.ibm.com/xmlns/prod/cognos/layoutData/200904">
<filterResult>
<filterType>XPATH</filterType>
<filterValue>//chart</filterValue>
<reportElement>
<chart>
<palette>
<paletteItem>
<pattern>
<type>ePatternSolid</type>
<fgColor>
<red>51</red>
<green>51</green>
.
.
.
</reportElement>
</filterResult>
</filterResultSet>
|
REST 示例 2:
本示例将访问示例 1 中的报告中的数据,并以 HTML Fragment 格式返回报告中的一个图表。
下面的参数用来构建本例的 URL:
- 资源类型:
reportData - 源类型:
report - Resource_id:报告存储 id;例如,
iE0CDFEF149F8408F96F1C27DCFFA6BCB - 选项:
fmt=HTMLFragment、selection=Chart1
URL 本身类似如下所示:
http://localhost/c841/cgi-bin/cognos.cgi/rds/reportData/report/iE0CDFEF149F8408F96F1C27DCFFA6BCB?fmt=HTMLFragment&selection=Chart1
图 3 展示了由返回的 HTML Fragment 生成的结果图表。
图 3. IBM Cognos Mashup Service 生成的图表
在运行这项操作之前,用户必须经过 IBM Cognos 8 的身份验证。一种身份验证方法就是使用 Mashup Services Developer Guide 中描述的 CMS 身份验证服务登录方法(参见 参考资料 小节,了解如何获得这份指南)。
REST 示例 3:
本例展示了如何以 HTML 格式运行报告,并且每个页面最多返回三行数据。
下面的参数用于构建本例的 URL:
- 资源类型:
reportData - 源类型:
report - Resource_id:报告存储 id;例如,
i6243D3E1A36A4E0FAF9D90652C171FC2 - 选项:
fmt=HTML、selection=List1、rowLimit=3
URL 本身类似如下所示:
http://localhost/c841/cgi-bin/cognos.cgi/rds/reportData/report/i6243D3E1A36A4E0FAF9D90652C171FC2?fmt=HTML&selection=List1&rowLimit=3
图 4 展示了由返回的 HTML 生成的结果表格。
图 4. 使用 IBM Cognos Mashup Service 生成的 HTML 格式的有限输出
表 3 展示了 SOAP API 接口的一些通用方法。
表 3. SOAP 方法
| 方法 | 描述 |
|---|---|
| drill | 使用这个从属(secondary)方法上钻或下钻现有的报告会话。 |
| getOutput | 使用该方法检索报告的输出。 |
| getPromptAnswers | 在 getPromptPage 请求后使用此方法检索提示页面的答案。 |
| getPromptContent | 使用此方法检索报告的内容。 |
| getReportData | 使用此方法以指定的格式检索报告的内容。 |
有关更多信息(包括额外的选项),请参考 Mashup Services Developer Guide(参见 参考资料,详细了解如何获得这份指南)。
使用 Java API 的 SOAP 示例:
本例演示了如何提取一个列表,它将从一个包含列表和图形的报告中访问所有报告元素。
样例 Java 代码
ReportDataServicePortProxy proxy = new ReportDataServicePortProxy();
//The endpoint will be the gateway URL for your server
proxy.setEndpoint(url);
ReportDataServicePort mashupService = proxy.getReportDataServicePort();
GetReportDataRequest request = new GetReportDataRequest();
//This sets the cm searchPath as the source of the report, you
//could alternatively use the storeId
request.setSourceID("/content/folder[@name='Samples']/folder[@name='Models']
/package[@name='GO Data Warehouse (analysis)']/folder[@name='Query Studio
Report Samples']/query[@name='Returns by Product Type']");
//This identifies that the sourceID refers to a CM search path
request.setSourceType(SourceTypeEnum.searchPath);
//This creates an object id filter to only return the List1 element,
OBJECT_ID is the type of filter that
//filters based on element id.
Filter[] filters = {new Filter("List1", FilterTypeEnum.OBJECT_ID, null)};
request.setFilters(filters);
GetOutputResponse response = mashupService.getReportData(request);
GetOutputRequest outputRequest = new GetOutputRequest();
/*
* This loop is necessary when running asynchronously
*/
while(response.getSession().getStatus() == SessionTypeStatus.working)
{
outputRequest.setSession(response.getSession());
response = mashupService.getOutput(outputRequest);
}
/*
* This block of code goes through the list contents and outputs them to the console
*/
ListFrame list1 = response.getOutput().getLDXOutput()
.getFilterResultSet().getFilterResult()[0]
.getReportElement()[0].getLst();
Row[] rows = list1.getGroup().getRow();
System.out.println();
System.out.print("Product type");
int spaceOfCell=25-("Product type".length());
for (int n=0;n<spaceOfCell;n++)
{ System.out.print(" ");}
System.out.print("Base product");
spaceOfCell=35-("Base product".length());
for (int n=0;n<spaceOfCell;n++)
{ System.out.print(" ");}
System.out.print("Lost revenue");
spaceOfCell=20-("Lost revenue".length());
for (int n=0;n<spaceOfCell;n++)
{ System.out.print(" ");}
System.out.println();
System.out.println();
for(int i = 0; i < rows.length; i++)
{
Cell[] cells = rows[i].getCell();
System.out.print(cells[0].getItem(0).getTxt().getFmtVal());
spaceOfCell=25-(cells[0].getItem(0).getTxt().getFmtVal().length());
for(int j=0;j<spaceOfCell;j++)
{ System.out.print(" ");}
System.out.print(cells[1].getItem(0).getTxt().getFmtVal());
spaceOfCell=35-cells[1].getItem(0).getTxt().getFmtVal().length();
for(int j=0;j<spaceOfCell;j++)
{ System.out.print(" ");}
System.out.print(cells[5].getItem(0).getTxt().getFmtVal());
spaceOfCell=20-cells[5].getItem(0).getTxt().getFmtVal().length();
for(int j=0;j<spaceOfCell;j++)
{ System.out.print(" ");}
System.out.println();
}
|
图 5 展示了由上面的样例代码生成的示例输出:
图 5. Java 示例的结果
目前,CMS 包含了多个样例。这些样例默认被作为 IBM Cognos Software Development Kit 的一部分安装。
REST 样例使用 HTML 和 JavaScript 编写。这些样例可以从 Web 浏览器上运行,并安装到以下目录:
<c8_install>/webcontent/samples/sdk/cms
SOAP API 样例使用 C# 和 Java 编写。这些样例被安装到如下目录:
<c8_install>/sdk/cms
有关这些样例的更多信息,请参考 Mashup Services Developer Guide(参见 参考资料 小节,了解如何获得该指南)。
图 6 展示了 JavaScript 样例的主菜单的屏幕截图,展示了其中包含的内容项。这些样例并不是最终用户使用的应用程序;它们仅仅是用来向您演示使用 CMS 可以实现哪些任务。
图 6. 样例程序
感谢您阅读这篇 IBM Cognos Mashup Services 简介。本文的目的就是使您了解使用 CMS 可以完成哪些任务,以及如何使用两种不同的接口执行一些基本任务。
学习
-
Mashup Services Developer Guide 被包含在 IBM Cognos 软件安装中。当完成 Cognos 安装后,您可以在下面的位置找到这份指南的英文版:
IBM Cognos installation directory\webcontent\documentation\en\dg_cms.pdf -
“IBM Cognos Mashup Service Product 说明和演示”
- “IBM Cognos
SDK Validation Tool”(developerWorks,2008 年 8 月),提供有关 Cognos SDK 验证工具的信息,您可以使用该工具对 Content Store 中的所有报告运行完整的验证检查。
讨论
- 参与论坛讨论。
- 加入 My developerWorks
IBM Cognos Mashup Service
组。
- 参与
developerWorks
博客 并加入 developerWorks 社区。

