oracle 19c中调用restful api必须配置acl:先用create_acl授connect权限,再用add_privilege补resolve权限(域名必需),最后用assign_acl精确绑定主机与端口(如api.example.com:443),全程需dba执行并commit。
oracle 19c 中能用 utl_http 调用 restful api,但必须先解决权限和网络访问这两道硬门槛,否则直接报 ora-29273 + ora-24247。
为什么执行就报 ORA-24247:网络访问被 ACL 拒绝?
这是最常卡住的第一步。Oracle 11g 起强制启用网络访问控制列表(ACL),即使你有 EXECUTE ON UTL_HTTP 权限,没配 ACL 也完全连不出去。
-
DBMS_NETWORK_ACL_ADMIN.create_acl必须指定principal(即数据库用户名),不能写通配符或角色名 -
host参数要精确匹配目标域名——比如调https://api.example.com,ACL 就得设host => 'api.example.com',设成example.com或带端口(如'api.example.com:443')都可能失败 - HTTPS 场景下,
lower_port和upper_port建议设为443;HTTP 则是80;若目标用非标端口(如:8443),ACL 必须显式覆盖该端口范围 - ACL 配完后,用
SELECT * FROM DBA_NETWORK_ACLS和SELECT * FROM DBA_NETWORK_ACL_PRIVILEGES确认已生效
POST 请求中 Content-Length 为什么总出错?
Content-Length 是字节数,不是字符数。UTF-8 下一个中文占 3 字节,LENGTH('你好') 返回 2,但实际要传 LENGTHB('你好') 才是 6 —— 写错会导致服务端收不到完整 body 或直接拒收。
- JSON body 含中文时,若数据库字符集是
ZHS16GBK,UTL_HTTP.write_text会按 GBK 编码发送,对方很可能解析失败;应改用UTL_HTTP.write_raw(UTL_RAW.cast_to_raw(CONVERT(json_body, 'AL32UTF8', 'ZHS16GBK'))) - 务必在
write_text或write_raw之前调用UTL_HTTP.set_header(req, 'Content-Length', ...),顺序颠倒无效 - 不要依赖
UTL_HTTP.set_body(该函数不存在),老教程里写的都是错的
超时、响应读取与 HTTPS 证书问题
默认 60 秒超时太短,尤其调外部 API;而读响应不加异常处理,容易卡死或漏数据。
- 用
UTL_HTTP.set_transfer_timeout(120)提前设置超时(单位秒),必须在begin_request之后、get_response之前调用 - 读响应必须用
BEGIN ... EXCEPTION WHEN UTL_HTTP.end_of_body THEN ... END包裹循环,否则遇到空响应或流中断会抛未捕获异常 - HTTPS 目标若用自签名证书或旧版 TLS,Oracle 19c 默认拒绝连接;需用
UTL_HTTP.set_wallet指向 Oracle Wallet,并确保 wallet 中导入了对应 CA 证书(单纯关 SSL 验证不可行) -
resp.status_code一定要检查,200以外的状态(比如401、502)不会自动抛异常,得自己判断并处理
真正麻烦的不是写几行 UTL_HTTP 调用,而是 ACL 的 host 精确性、Content-Length 的字节计算、以及 HTTPS 证书链的信任配置——这三处出问题,日志里往往只显示模糊的“HTTP 请求失败”,得逐层验证。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











