2012-03-08 32 views
11

È possibile utilizzare i servizi web jasperservers (SOAP e REST è disponibile) per ottenere mange ed eseguire report da un'applicazione Web. Il SOAP wsdl non è compatibile con asp.net C# (almeno, non riesco a farlo funzionare), quindi ho deciso di utilizzare il webservice REST.Ottieni report da jasperserver utilizzando REST webservice e asp.net C#

Sono quasi QUASI, ma non riesco a recuperare il report stesso. qualcuno sa cosa va storto? Sto usando jasperserver CE 4.5 su Linux.

// Setup WebClient 
WebClient httpclient = new WebClient(); 

//Basic Auth 
httpclient.Credentials = new NetworkCredential("NAME", "PASSWD"); 
httpclient.Headers.Add("Content-Type", "application/x-www-form-urlencoded"); 

// Build resourceDescriptor 
string requestXml; 
requestXml = "<resourceDescriptor name="budget_overzicht_per_klant" wsType="reportUnit" uriString="/Declaraties/12change/Klant/budget_overzicht_per_klant"n"; 
requestXml += " isNew="false">n"; 
requestXml += " <label>null</label>n"; 
requestXml += " <parameter name="klantid">14</parameter>n"; 
requestXml += " <parameter name="start">20120101</parameter>n"; 
requestXml += " <parameter name="eind">20120302'</parameter>n"; 
requestXml += " <parameter name="Titel">Test 123</parameter>n"; 
requestXml += "</resourceDescriptor>n"; 

// Send PUT 
string requestAllResult = httpclient.UploadString("http://website/jasperserver/rest/report/Declaraties/12change/Klant/budget_overzicht_per_klant?RUN_OUTPUT_FORMAT=PDF", "PUT", requestXml); 

// requestAllResult contains: 
//<report> 
// <uuid>f521fe7d-7432-4c47-962c-9fec29bdaa43</uuid> 
// <originalUri>/Declaraties/12change/Klant/budget_overzicht_per_klant</originalUri> 
// <totalPages>4</totalPages> 
// <startPage>1</startPage> 
// <endPage>4</endPage> 
// <file type="application/pdf"><![CDATA[report]]></file> 
//</report> 
// You have to use the uuid to GET the file 'report' 
// 
// Extract uuid, filename is always report 
System.Xml.XmlDocument doc = new System.Xml.XmlDocument(); 
doc.LoadXml(requestAllResult); 
XmlNode node = doc.DocumentElement.SelectSingleNode("uuid"); 
string uuid = node.InnerText; 

//Build GET URL 
string reportUrl = "http://website/jasperserver/rest/report/"; 
reportUrl += uuid; 
reportUrl += "?file=report"; 

// the value of report Url is now 
// "http://website/jasperserver/rest/report/f521fe7d-7432-4c47-962c-9fec29bdaa43?file=report" 

// Get report 
string report; 
report = httpclient.DownloadString(reportUrl); 

// Exception, HTTP 404 ERROR???? 

L'errore sembra significare che l'uuid non è nella sessione corrente. Qualcuno ha funzionato? Grazie!

risposta

13

io rispondere alla mia domanda:

Il PUT restituisce un cookie nell'intestazione di risposta, che si deve utilizzare nella successiva GET:

// Send PUT 
string requestAllResult = httpclient.UploadString("http://website/jasperserver/rest/report/Declaraties/12change/Klant/budget_overzicht_per_klant?RUN_OUTPUT_FORMAT=PDF", "PUT", requestXml); 

// Get session cookie 
string session = httpclient.ResponseHeaders.Get("Set-Cookie"); 
// Set session cookie 
httpclient.Headers.Add("Cookie", session); 

// Get report 
report=httpclient.DownloadString("http://website/jasperserver/rest/report/f521fe7d-7432-4c47-962c-9fec29bdaa43?file=report"); 

E il gioco è fatto!

+0

Credo che il PUT dovrebbe essere contro 'http: // website/jasperserver/rest/report? RUN_OUTPUT_FORMAT = PDF' almeno dalla versione 4.5 – KCD

1

Amico, grazie mille, questo è stato il singolo post più utile che ho trovato su come ottenere rapporti da JasperServer tramite REST e sto utilizzando Ruby on Rails. Dopo l'aggiornamento a JS 5.0 ho trovato l'interfaccia SOAP molto inaffidabile, in pratica dovevi colpirlo due volte per generare il rapporto. Non ho avuto successo con l'interfaccia rest_v2, non è mai sembrato onorare alcun parametro passato ad esso.

Così ho provato l'interfaccia REST più vecchia e funziona correttamente. Per qualsiasi ragazzo di Rails, ecco il mio (leggermente disordinato) codice della console.

report = 'TempSpeedLimit' 
params = {:tsl_id => 744} 
request_body = "<resourceDescriptor name='#{report}' wsType='reportUnit' uriString='/reports/hawk/#{report}' isNew='false'><label>null</label>" 
params.each{|k,v| request_body += "<parameter name='#{k}'>#{v}</parameter>"} 
request_body += "</resourceDescriptor>" 
body_put = '' 
body_get = '' 
cookie_put = '' 

uri_put = URI.parse("http://<yourhost>:8080/jasperserver/rest/report/reports/hawk/#{report}") 
http_put = Net::HTTP.new(uri_put.host, uri_put.port) 
http_put.start do |http| 
req = Net::HTTP::Put.new(uri_put.path + "?RUN_OUTPUT_FORMAT=PDF") 
req.basic_auth('jasperadmin', 'secretpassword') 
req.body = request_body 
resp = http.request(req) 
body_put = resp.body 
cookie_put = resp['Set-Cookie'] 
end 

xml = REXML::Document.new(body_put) 
uuid = xml.elements["report/uuid"].text 

uri_get = URI.parse("http://<yourhost>:8080/jasperserver/rest/report/#{uuid}") 
http_get = Net::HTTP.new(uri_get.host, uri_get.port) 
http_get.start do |http| 
req = Net::HTTP::Get.new(uri_get.path + "?file=report") 
req.basic_auth('jasperadmin', 'secretpassword') 
req['cookie'] = cookie_put 
resp = http.request(req) 
body_get = resp.body 
end 

f = File.new('test.pdf', 'wb') 
f.write(body_get) 
f.close 
Problemi correlati