使用PHP SOAP客户端从JasperServer运行报告

时间:2011-12-07 15:54:14

标签: php soap jasper-reports jasperserver

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

如何将我的XML数据源附加到Jasper Server可接受的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

它的目标是创建这样的东西: Jasper Server PHP Client

4 个答案:

答案 0 :(得分: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)

以下链接也可能有用:

答案 1 :(得分:0)

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

对此有任何帮助吗?

答案 2 :(得分:0)

SOAP请求没有附件支持。

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

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

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

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

答案 3 :(得分:0)

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

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

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

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