Получите отчет от jasperserver, используя веб-службу REST и asp.net С# - программирование
Подтвердить что ты не робот

Получите отчет от jasperserver, используя веб-службу REST и asp.net С#

Вы можете использовать веб-службы jasperservers (доступны SOAP и REST), чтобы получать mange и запускать отчеты из веб-приложения. SOAP wsdl несовместим с asp.net С# (по крайней мере, я не могу заставить его работать), поэтому я решил использовать веб-сервис REST.

Я ЛЮБЛЮ там, но я не могу получить сам отчет. кто-нибудь знает, что пошло не так? Я использую jasperserver CE 4.5 для 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????

Ошибка, похоже, означает, что uuid не находится в текущем сеансе. Кто-нибудь получил эту работу? Спасибо!

4b9b3361

Ответ 1

Я отвечу на свой вопрос:

PUT возвращает Cookie в заголовке ответа, который вы должны использовать в следующем 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");

И что это!

Ответ 2

Dude очень благодарен, что это был самый полезный пост, который я нашел при получении отчетов из JasperServer через REST, и я использую Ruby on Rails. После обновления до JS 5.0 я обнаружил, что SOAP-интерфейс очень ненадежный, в основном вам приходилось дважды ударять его по генерации отчета. У меня был нулевой успех с интерфейсом rest_v2, он никогда, казалось, не выполнял никаких параметров, переданных ему.

Итак, я опробовал старый интерфейс REST и его работоспособность. Для всех рельсов Rails здесь мой (слегка грязный) консольный код.

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