从APEX应用下载Jasper报表时触发ORA-29273错误,求问题原因
ORA-29273: HTTP请求失败问题排查(APEX调用Jasper报表场景)
场景描述
我有一个APEX应用,原本可通过点击按钮,将JasperStudio设计、存储于JasperReports Server的报表直接下载到本地下载文件夹。点击按钮触发的名为VIEWPersonalInfo的Process代码如下:
-- assign value for Application Item :APP_FILE_NAME := 'Customer_Personal_information' ; --- Name of Report on the Server :APP_FILE_TYPE := 'PDF' ; --- the file format to be used :APP_PARM_NAME := 'ID' ; ---- name of the parameter on the server :APP_PARM_VALUE := :P2_ID; ----Name of the Page Item -- call GET_REPORT procedure GET_REPORT ( p_file_name => :APP_FILE_NAME , p_file_type => :APP_FILE_TYPE , p_paramter_name => :APP_PARM_NAME , p_paramter_value => :APP_PARM_VALUE ) ;
用于连接JasperReports Server的GET_REPORT存储过程代码如下:
create or replace PROCEDURE GET_REPORT (p_file_name VARCHAR2 ,p_file_type VARCHAR2 ,p_paramter_name VARCHAR2 ,p_paramter_value VARCHAR2 ) IS v_blob BLOB; v_file_name VARCHAR2 (100) := p_file_name||'.'||p_file_type; v_vcContentDisposition VARCHAR2 (100) := 'inline'; v_hostname VARCHAR2(100) := 'IP'; -- your hostname, eg: localhost v_port NUMBER := 'port'; -- port for your JasperReports Server, eg: 8081 v_username VARCHAR2(100) := 'jasperadmin'; -- jasperreports server username v_password VARCHAR2(100) := 'jasperadmin'; -- jaspereports server password v_jasper_string VARCHAR2(100) := v_username || ';' || v_password; v_login_url VARCHAR2(100) := 'http://' || v_hostname || ':' || v_port || '/jasperserver/rest/login'; -- modify below URL before use! -- you should modify the line below; change /Pretius/ to your own name -- before you add a line try your URL in a web browser v_report_url VARCHAR2(100) := 'http://' || v_hostname || ':' || v_port || '/jasperserver/rest_v2/reports/reports/' || v_file_name; BEGIN -- log into jasper server v_blob := apex_web_service.make_rest_request_b( p_url => v_login_url, p_http_method => 'GET', p_parm_name => apex_util.string_to_table('j_username;j_password',';'), p_parm_value => apex_util.string_to_table(v_jasper_string,';') ); -- download file v_blob := apex_web_service.make_rest_request_b( p_url => v_report_url, p_http_method => 'GET', p_parm_name => apex_util.string_to_table(p_paramter_name,';'), p_parm_value => apex_util.string_to_table(p_paramter_value,';') ); --OWA_UTIL.mime_header ('application/pdf', FALSE); -- view your pdf file OWA_UTIL.MIME_HEADER( 'application/octet', FALSE ); -- download your pdf file HTP.p('Content-Length: ' || DBMS_LOB.GETLENGTH(v_blob)); HTP.p('Content-Disposition: ' || v_vcContentDisposition ||'; filename="' || v_file_name || '"'); OWA_UTIL.http_header_close; WPG_DOCLOAD.DOWNLOAD_FILE(v_blob); APEX_APPLICATION.STOP_APEX_ENGINE; EXCEPTION WHEN OTHERS THEN RAISE; END;
当前点击下载时出现错误:ORA-29273: HTTP request failed,以下是可能的问题及排查方向:
可能的问题及排查点
- Jasper服务器连接参数未正确配置
存储过程中v_hostname、v_port使用了占位符'IP'和'port',必须替换为JasperReports Server真实的IP/主机名和端口号。同时确认数据库服务器能ping通目标Jasper服务器,端口未被防火墙拦截。 - REST登录接口调用方式错误
JasperReports Server的/jasperserver/rest/login接口在部分版本中要求使用POST请求而非GET,且参数需以表单形式传递。可以先手动用Postman或浏览器测试登录接口,确认正确的请求方式和参数格式。 - 报表URL路径错误
检查v_report_url中的路径是否与Jasper Server中报表的实际存储路径匹配。比如报表是否存储在/reports/目录下,文件名是否正确。建议先在浏览器中直接访问拼接后的报表URL(带上ID=xxx参数),验证是否能正常返回PDF文件。 - 数据库网络访问权限不足
Oracle数据库所在服务器可能无法访问JasperReports Server地址,比如防火墙规则限制、未配置代理。可在数据库服务器上执行curl <Jasper登录URL>或wget <Jasper登录URL>测试网络连通性。 - APEX Web Service与数据库权限问题
确认APEX_WEB_SERVICE包已授予足够权限,同时检查数据库的UTL_HTTP访问控制列表(ACL)是否允许访问目标Jasper服务器地址。若需要代理访问,需在UTL_HTTP中配置正确的代理参数。 - 报表参数传递异常
确认Jasper报表中的参数名确实为ID,且:P2_ID传入的数值不为空、格式符合报表要求。可临时将p_paramter_value替换为固定有效值测试,排除参数问题。
内容的提问来源于stack exchange,提问作者Omatayo Holder
相关产品推荐
相关产品推荐

