Ruby Client para REST API do Jasper Report Server
Utilizar chamadas REST no Jasper Report Server foi uma bom desafio pra mim, aqui pra vocês o resultiado disso, um pequeno Script que resolve esse "problema" rapidinho. Utilizando BASIC AUTHENTICATION + mais a interface RESTFul do JasperReport.
Look Code in my Github https://github.com/LuizCarvalho/JasperRest/tree/master/ruby
[geshi lang="ruby" nums="1" target="_blank" ]
#!/usr/bin/env ruby # encoding: utf-8 require "rubygems" require "net/http" require "rexml/document" REPORT_NAME = 'StandardChartsReport' REPORT_GROUP = "samples" SERVER_ROOT = "127.0.0.1" #MUDE PARA O ENDERECO DE SEU SERVIDOR SERVER_PORT = 8080 SERVER_USER = "jasperadmin" SERVER_PASSWORD = "jasperadmin" FORMAT = "PDF" FILE_NAME = "report.pdf" REPORT_PATH = "http://#{SERVER_ROOT}:#{SERVER_PORT}/jasperserver/rest/report" def to_ms(time) start = Time.new(1970,1,1) ((time.to_f - start.to_f) * 1000.0).to_i end #parametros sendo passados somente como exemplo PARAMS = {:criacao_inicio=>to_ms(Time.new(2011,01,01)),:criacao_final=>to_ms(Time.new(2014,01,01))} def build_xml_request url_string = "/reports/#{REPORT_GROUP}/#{REPORT_NAME}" request_body = "" puts "CRIANDO XML PARA: #{url_string} " PARAMS.each do|k,v| request_body += "#{v.to_s}" puts "PARAMETROS: #{k}=#{v.to_s}; " end request_body += "" end def get_uuid_and_cookie body = "" cookie = "" puts "FULL URL: #{"#{REPORT_PATH}/reports/#{REPORT_GROUP}/#{REPORT_NAME}"}" uri = URI.parse("#{REPORT_PATH}/reports/#{REPORT_GROUP}/#{REPORT_NAME}") http = Net::HTTP.new(uri.host, uri.port) http.start do |http| req = Net::HTTP::Put.new(uri.path + "?RUN_OUTPUT_FORMAT=#{FORMAT}") puts "ACESSANDO: #{uri.path}?RUN_OUTPUT_FORMAT=#{FORMAT}" req.basic_auth(SERVER_USER, SERVER_PASSWORD) req.body = build_xml_request resp = http.request(req) body = resp.body puts "COOKIE RECEBIDO: #{resp['Set-Cookie']}" cookie = resp['Set-Cookie'] end xml = REXML::Document.new(body) puts "\n\n XML \n #{xml} \n\n" uuid_xml = xml.elements["report/uuid"] if uuid_xml uuid = uuid_xml.text puts "UUID RECEBIDO: #{uuid}" return uuid,cookie else puts "PROBLEMA AO RECEBER UUID. RESPOSTA: #{uuid_xml}" return false,false end end def get_file body_get = nil uuid,cookie = get_uuid_and_cookie if uuid uri_get = URI.parse("#{REPORT_PATH}/#{uuid}") puts "URL DO RELATORIO: #{uri_get}" 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") puts "REQ: #{req.path}" req.basic_auth(SERVER_USER, SERVER_PASSWORD) req['cookie'] = cookie resp = http.request(req) body_get = resp.body end end body_get end file = get_file if file #puts file f = File.new(FILE_NAME, 'wb') f.write(file) f.close else puts "Não foi possível criar o relatório" end
[/geshi]
[github file = "{https://github.com/LuizCarvalho/JasperRest/blob/master/ruby/report_rest.rb}"]