2

我想使用 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

它的目标是创建这样的东西: Jasper 服务器 PHP 客户端

4

4 回答 4

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)

以下链接也可能有用:

于 2011-12-15T15:35:26.377 回答
0

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

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

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

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

于 2011-12-16T18:35:23.813 回答
0

在他们自己的网站上,他们也有一些关于通过 php 集成到 Web 服务的示例。

有什么帮助吗?

于 2011-12-08T19:11:47.883 回答
0

SOAP请求没有附件支持。

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

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

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

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

于 2011-12-13T11:07:24.733 回答