如何使用apex_web_service.make_rest_request发送HTTPS POST请求并解决参数报错
解决APEX 18.1中apex_web_service.make_rest_request参数错误问题
你当前的问题是:用utl_http.request能成功调用HTTPS接口,但使用APEX 18.1的apex_web_service.make_rest_request带POST请求、基本认证和钱包参数时,触发ORA-06553: PLS-306参数错误。
问题原因
APEX 18.1版本的apex_web_service.make_rest_request函数不支持直接传入p_username和p_password参数,这两个参数是在更高版本的APEX中才新增的。你当前的调用因为传入了不存在的参数,导致参数数量/类型不匹配报错。
解决方案
方案1:手动构造Basic Auth请求头
直接生成符合HTTP Basic认证规范的请求头,传入函数的p_headers参数:
SELECT apex_web_service.make_rest_request( p_url => 'https://aa.xxxxxxx.com:port/dev/api/v1/asd', p_http_method => 'POST', p_wallet_path => 'file:/u01/wallet', p_wallet_password=> 'WalletPass', p_body => '', p_headers => apex_util.string_to_table('Authorization: Basic ' || utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw('asdasd:asdadsasd')))) ) FROM DUAL;
注意:这里用
utl_raw.cast_to_varchar2转换Base64编码结果,避免返回RAW类型导致的格式问题。
方案2:使用APEX静态凭据(推荐)
通过APEX工作区的凭据管理功能存储账号密码,避免硬编码:
- 进入APEX工作区,导航到应用程序构建器 → 共享组件 → 凭据 → 创建静态凭据,填入用户名
asdasd、密码asdadsasd,记录生成的静态ID。 - 调用函数时传入凭据静态ID:
SELECT apex_web_service.make_rest_request( p_url => 'https://aa.xxxxxxx.com:port/dev/api/v1/asd', p_http_method => 'POST', p_wallet_path => 'file:/u01/wallet', p_wallet_password => 'WalletPass', p_body => '', p_credential_static_id => '你的静态凭据ID' ) FROM DUAL;
额外说明
- 确保
p_wallet_path和p_wallet_password与你之前utl_http.request使用的完全一致,保证SSL连接正常。 - 如果需要发送JSON格式的请求体,需添加
Content-Type: application/json到请求头中,示例:p_headers => apex_util.string_to_table('Authorization: Basic xxxxxxxx'||chr(10)||'Content-Type: application/json')
内容的提问来源于stack exchange,提问作者Samuel
相关产品推荐
相关产品推荐

