【问题标题】:Run report from JasperServer using PHP SOAP client使用 PHP SOAP 客户端从 JasperServer 运行报告
【发布时间】:2011-12-07 15:54:14
【问题描述】:

我想使用 PHP SOAP 客户端从 JasperServer 运行报告。我在网上找到了这个例子,但是我想附加一个 XML 数据源,用于报告数据,我不确定它应该如何正确附加。

如何将我的 XML 数据源附加到 Jasper 服务器可接受的 SOAP 请求?

  public function requestReport($report, $format, $params) {
    $params_xml = "";
    foreach ($params as $name => $value) {
      $params_xml .= "<parameter name=\"$name\"><![CDATA[$value]]></parameter>\n";
    }

    $request = "
      <request operationName=\"runReport\" locale=\"en\">
        <argument name=\"RUN_OUTPUT_FORMAT\">$format</argument>
        <resourceDescriptor name=\"\" wsType=\"\"
        uriString=\"$report\"
        isNew=\"false\">
        <label>null</label>
        $params_xml
        </resourceDescriptor>
      </request>
    ";

    $client = new SoapClient(null, array(
        'location'  => $this->url,
        'uri'       => 'urn:',
        'login'     => $this->username,
        'password'  => $this->password,
        'trace'    => 1,
        'exception'=> 1,
        'soap_version'  => SOAP_1_1,
        'style'    => SOAP_RPC,
        'use'      => SOAP_LITERAL

      ));

    $pdf = null;
    try {
      $result = $client->__soapCall('runReport', array(
        new SoapParam($request,"requestXmlString") 
      ));

      $pdf = $this->parseReponseWithReportData(
        $client->__getLastResponseHeaders(),
        $client->__getLastResponse());
    } catch(SoapFault $exception) {
      $responseHeaders = $client->__getLastResponseHeaders();
      if ($exception->faultstring == "looks like we got no XML document" &&
          strpos($responseHeaders, "Content-Type: multipart/related;") !== false) {
        $pdf = $this->parseReponseWithReportData($responseHeaders, $client->__getLastResponse());
      } else {
        throw $exception;
      }
    }

    if ($pdf)
      return $pdf;
    else
      throw new Exception("Jasper did not return PDF data. Instead got: \n$pdf");
  }

我在这里找到的完整示例 https://gist.github.com/26205

它的目标是创建这样的东西:

【问题讨论】:

  • 您是否要求有人为您编写代码?您必须深入研究您的问题,而不是“我想要一个我的整个项目的工作示例”。
  • 不,只需要知道如何在PHP中制作Jasper Server可以接受的XML数据附件。其余部分大部分已完成,并将开源。

标签: php soap jasper-reports jasperserver


【解决方案1】:

这更像是一个评论而不是一个答案,但可能会有所帮助。有一个库叫WSO2 WSF/PHP

WSO2 WSF/PHP 旨在填补 PHP 扩展中的一些空白。 WSO2 WSF/PHP 是类似于 SOAP 扩展的开源实现,支持 MTOM、WS-Addressing、WS-Security 和 WS-RelaiableMessaging。 WSO2 WSF/PHP 支持与 SOAP 扩展类似的 API。有计划封装 API 以提供与 SOAP 扩展相同的 API;它将用 C 语言编写。

我认为您正在寻找二进制附件 (MTOM)

以下链接也可能有用:

【讨论】:

    【解决方案2】:

    On their own site 他们也有一些关于通过 php 集成到 Web 服务的示例。

    有什么帮助吗?

    【讨论】:

    • 我看不到任何关于附加 XML 数据集以报告的内容
    【解决方案3】:

    SOAP 请求不支持附件。

    想法是您如何处理您的请求。 我使用带有附件的 SOAP 请求的唯一方法是 Base64 Encode 要附加的数据,并将其添加到 Text 节点。

    添加属性为encoded="true/false"的标签。如果是文件内容,请在请求中提供文件名。

    在服务器端,如果您找到具有属性encoded="true" 的节点,您可以从节点中获取数据,对其进行Base64Decode 并执行您需要的操作。

    Base64 的想法是避免 SOAP 请求在 Request 中不支持的许多特殊字符。一些 SOAP 处理器可以选择“encoded”属性。

    【讨论】:

    【解决方案4】:

    您想在您的 SOAP 查询或响应中包含一个 xml 文件吗?

    您可以像在电子邮件中一样对其进行 base64 编码,然后要求另一端的用户对其进行解码。

    $data = chunk_split(base64_encode($xml_data));
    

    然后只需将其添加到您的 SOAP 查询/响应中的单独 xml 标记中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-27
      • 2010-10-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多