使用 ReportRawData 调用 BI Publisher Web 服务

Posted

技术标签:

【中文标题】使用 ReportRawData 调用 BI Publisher Web 服务【英文标题】:Call BI Publisher web service with ReportRawData 【发布时间】:2014-12-19 00:29:50 【问题描述】:

目标:在 SOAP 请求中为 BI Publisher 报告的 RunReport() 方法提供 XML 数据。

环境: Oracle BI Publisher 11.1.1.7.0(内部版本:20130303.1415)

客户端 - SoapUI 5.0.0.0 或自定义 PL/SQL 代码(Oracle 数据库 11g 企业版版本 11.2.0.3.0 - 64 位生产)调用服务,使用 http_util 与同一 BI Publisher 服务器上的其他报告一起使用通过parameterNameValues节点传递参数。

研究: 花了很多时间后,我发现只有this topic on OTN(需要注册),顺便解释了如何使用reportRawData参数。我尝试使用此建议,但没有成功。

问题: 是否可以在调用 RunReport() 时直接在 SOAP 请求中提供 XML 数据,而无需上传/创建临时文件且不使用 JDBC 数据源? 我很可能错过了一些明显的东西,所以请查看下面的示例设置和 SOAP 请求的结构。

在我的情况下,我已经知道至少一种可能的解决方法(例如,组织临时 JDBC 数据源以从中获取数据),但想知道是否有任何明确且可行的方法来实现此任务。

设置示例: 1.创建示例XML数据文件test_ds_example.xml

  `<?xml version="1.0" encoding="utf-8"?>`  
  `<test> <field_val>AAAAA</field_val></test>`

    创建数据源 test_ds

    添加test_ds XML 文件数据集并提供test_ds_example.xml 作为本地文件:

    测试数据并保存为样本:

    根据test_ds 创建报告:

    创建一个基本模板,其中包含短语“Field Val:”和从/test/field_val填充的字段

    BI Publisher GUI 中的测试报告并获得文本“Field Val: AAAAA”

    发出 SOAP 请求,字段值更改为 B-B-B-B-B

数据:

  `<?xml version="1.0" encoding="utf-8"?>`  
  `<test> <field_val>B-B-B-B-B</field_val></test>`

请求reportRawData节点中的数据:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:pub="http://xmlns.oracle.com/oxp/service/PublicReportService">
   <soapenv:Header/>
   <soapenv:Body>
      <pub:runReport>
         <pub:reportRequest>
            <pub:attributeFormat>html</pub:attributeFormat>
            <pub:attributeTemplate>claimnotification_xml</pub:attributeTemplate>
            <pub:byPassCache>True</pub:byPassCache>
            <pub:dynamicDataSource>
               <pub:fileDataSource>
                  <pub:dynamicDataSourcePath/>
                  <pub:temporaryDataSource>True</pub:temporaryDataSource>
               </pub:fileDataSource>
            </pub:dynamicDataSource>
            <pub:parameterNameValues/>
            <pub:reportAbsolutePath>/a_test/test_xml_report.xdo</pub:reportAbsolutePath>
            <pub:sizeOfDataChunkDownload>-1</pub:sizeOfDataChunkDownload>
         </pub:reportRequest>
         <pub:saveDataOption>False</pub:saveDataOption>
         <pub:reportRawData>&lt;?xml version="1.0" encoding="utf-8"?&gt;&lt;test&gt; &lt;field_val&gt;B-B-B-B-B&lt;/field_val&gt;&lt;/test&gt;</pub:reportRawData>
         <pub:userID>weblogic_user</pub:userID>
         <pub:password>weblogic_user_password</pub:password>
      </pub:runReport>
   </soapenv:Body>
</soapenv:Envelope>
    执行请求,但它返回“Field Val: AAAAA”而不是预期的“Field Val:B-B-B-B-B”:(

【问题讨论】:

【参考方案1】:

经过大量实验,我决定通过reportData标签以base64编码形式传递相同的XML数据,所以最终的SOAP请求形式如下:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:pub="http://xmlns.oracle.com/oxp/service/PublicReportService">
   <soapenv:Header/>
   <soapenv:Body>
      <pub:runReport>
         <pub:reportRequest>
            <pub:attributeFormat>html</pub:attributeFormat>
            <pub:attributeTemplate>claimnotification_xml</pub:attributeTemplate>
            <pub:byPassCache>True</pub:byPassCache>
            <pub:dynamicDataSource>
               <pub:fileDataSource>
                  <pub:dynamicDataSourcePath/>
                  <pub:temporaryDataSource>True</pub:temporaryDataSource>
               </pub:fileDataSource>
            </pub:dynamicDataSource>
            <pub:parameterNameValues/>
            <pub:reportAbsolutePath>/a_test/test_xml_report.xdo</pub:reportAbsolutePath>
            <pub:sizeOfDataChunkDownload>-1</pub:sizeOfDataChunkDownload>
         </pub:reportRequest>
         <pub:saveDataOption>False</pub:saveDataOption>
         <pub:reportData>PD94bWwgdmVyc21vbj0iMS4wIiB1bmNvZG1uZz0iVVRGLTgiPz48dGVzdD48ZmllbGRfdmFsPkItQi1CLUItQjwvZmllbGRfdmFsPjwvdGVzdD4=</pub:reportData>
         <pub:userID>weblogic_user</pub:userID>
         <pub:password>weblogic_user_password</pub:password>
      </pub:runReport>
   </soapenv:Body>
</soapenv:Envelope>

此解决方案与初始目标不完全匹配,但允许我在呈现简单文档的情况下避免使用外部数据源。

【讨论】:

【参考方案2】:

这里只有一个错误。 reportData 标记必须在 reportRequest 标记范围内。您在它之外给出它。 另请注意,XML 数据必须以 base64 格式编码。

【讨论】:

以上是关于使用 ReportRawData 调用 BI Publisher Web 服务的主要内容,如果未能解决你的问题,请参考以下文章

忽略 Power BI 查询中的空白调用自定义函数

如何从 BI Publisher 调用存储过程?

在 Power Query 中调用 Power BI API

PL/SQL调用BIEE WebServices清理BI Server缓存

Python中不定长参数这样用对吗?def hh(w,**l,pu='d'): 为啥?

Power BI--DAX函数总结