2011-12-07 80 views
2

我想使用PHP SOAP客戶端從JasperServer運行報告。我在網上找到了這個例子,但我想附加一個用於報表數據的XML數據源,但我不確定它應該如何正確連接。使用PHP SOAP客戶端從JasperServer運行報告

如何將我的XML數據源附加到SOAP請求,這是Jasper Server可接受的?

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

+0

您是否要求某人爲您編寫代碼?你必須深入研究你的問題,而不是「我想要一個我整個項目的實例」。 –

+1

不,只需要知道如何在PHP中使用Jasper Server可以接受的XML數據附件。其餘的大部分工作都已完成,並將成爲開放源代碼。 – FlappySocks

回答

0

On their own site他們也有關於通過PHP集成Web服務的一些例子。

對此有幫助嗎?

+0

我無法看到任何關於附加XML數據集來報告 – FlappySocks

0

SOAP請求沒有附件支持。

這個想法是你如何處理你的請求。 我使用帶附件的SOAP請求的唯一方法是將要附加的數據添加到Base64 Encode,並將其添加到文本節點。

添加標籤與屬性encoded=true/false"。如果它的文件內容,在要求提供文件的名稱。

在服務器端,如果你發現有一個屬性encoded="true",您可以在節點Base64解碼並做你所需要的任何東西

Base64的想法是爲了避免許多SOAP請求在Request中不支持的特殊字符,有些SOAP處理器可以選擇「encoded 「屬性

+1

顯然,您可以將附件添加到SOAP請求。它可以與Jasper Server一起工作,根據這個:http://stackoverflow.com/questions/4351511/upload-report-unit-via-webservice-in-c-sharp-net-to-jasperserver – FlappySocks

1

Th是比評論更多評論,但可能有幫助。有一個庫名爲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)

以下鏈接可能是有用的:

0

你想包括一個XML文件中的SOAP查詢或響應?

你可以像電子郵件一樣對它進行編碼,然後要求另一端的用戶對它進行解碼。

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

然後只需將它添加到SOAP查詢/響應中的單獨xml標記中即可。