2012-03-08 45 views
11

Puede usar los servicios web jasperservers (SOAP y REST están disponibles) para obtener administración y ejecutar informes desde una aplicación web. SOAP wsdl no es compatible con asp.net C# (al menos, no puedo hacer que funcione), así que decidí usar el servicio web REST.Obtenga el informe de jasperserver utilizando REST webservice y asp.net C#

Estoy CASI allí, pero no puedo recuperar el informe en sí. ¿Alguien sabe qué va mal? Estoy usando jasperserver CE 4.5 en 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???? 

Parece que el error significa que el uuid no está en la sesión actual. Alguien tiene esto funcionando? ¡Gracias!

Respuesta

13

Voy a responder a mi propia pregunta:

El PUT devuelve una cookie en la cabecera de la respuesta, que hay que utilizar en el GET posterior:

// 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"); 

Y eso es todo!

+0

creo que el PUT debe estar contra 'http: // web/JasperServer/descanso/informe RUN_OUTPUT_FORMAT = PDF' al menos a partir de la versión 4.5 – KCD

1

Dude muchas gracias esta fue la publicación más útil que he encontrado para obtener informes de JasperServer a través de REST, y estoy usando Ruby on Rails. Después de actualizar a JS 5.0, encontré que la interfaz SOAP no era muy fiable, básicamente tenía que pulsar dos veces para que se generara el informe. Tuve cero éxito con la interfaz rest_v2, nunca pareció respetar los parámetros que se le pasaron.

Así que probé la antigua interfaz REST y está funcionando bien. Para cualquier chico de Rails, aquí está mi código de consola (ligeramente desordenado).

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 
Cuestiones relacionadas