Sich eigene Reports oder sogar erweiterbare Reportframeworks zu schreiben ist mühsam und zeitaufwendig. Vor allem wenn es bereits gute Lösungen in dem Bereich gibt wie z.B. JasperServer. Neben einem eigenem Interface zur Verwaltung von Berichten und deren Ressourcen exportiert der Server gleichzeitig seine ganze Funktionalität durch SOAP nach außen. Die Installation geht mit wenigen Zeilen von statten. Entweder kann man sich ein Komplettpaket ziehen oder nur die Applikation welche auf einem Tomcat Server deployed werden muss.
Jasper Reports können mit einem Reportdesigner (iReport) erstellt werden und auf den Server übertragen werden. Danach können sie entweder direkt abgerufen werden oder zeitgesteuert per Mails verschickt werden.
Mit PHP und etwas gemogel kommt man relativ einfach zu seinem Report im gewünschten Format:
<?php $jasper_wsdl = 'http://10.121.0.95:8080/jasperserver/services/repository?wsdl'; $client = new SOAPClient($jasper_wsdl, array ( 'login' => 'jasperadmin', 'password' => 'jasperadmin', 'trace' => true )); $request = '<?xml version="1.0" encoding="UTF-8"?> <request operationName="runReport" locale="en"> <argument name="RUN_OUTPUT_FORMAT"><![CDATA[PDF]]></argument> <resourceDescriptor name="" wsType="" uriString="/Icinga/reports/host.overview" isNew="false"> <label>null</label> <parameter name="p_host_object_id"><![CDATA[1]]></parameter> </resourceDescriptor> </request>'; // Rückgabe ist nicht XML sondern multipart try { $re = $client->runReport($request); } catch (SOAPFault $e) { if ($e->getMessage() !== 'looks like we got no XML document') { throw $e; } } $headers = $client->__getLastResponseHeaders(); $m = array(); // Splitten der Ausgabe und finden des reports if (preg_match('/boundary="([^"]+)"/', $headers, $m)) { $content = explode('--'. $m[1], $client->__getLastResponse()); foreach ($content as $part) { if (strpos($part, 'Content-Id: <report>')!==false) { list($header, $content) = explode("\r\n\r\n", $part); file_put_contents('report.pdf', $content); break; } } }
Die Antworten vom Jasper sind MIME multipart/related weshalb man den nativen PHP Soap Client etwas austricken und die die Inhalte zusammensuchen muss.
Der Webservice ist übrigens hervorragend dokumentiert.
0 Comments