Oracle中如何在日志中打印UTL_HTTP请求的HTTP头信息
解决UTL_HTTP请求头无法打印的问题
l_http_request是UTL_HTTP.REQ类型的对象,不能直接通过字符串拼接输出。要打印已配置的请求头,需要用UTL_HTTP提供的API遍历,或者启用调试日志,具体方法如下:
方法一:遍历请求头字段
通过UTL_HTTP.GET_HEADER_COUNT获取头的总数,再循环调用UTL_HTTP.GET_HEADER逐个取出头的名称和值:
DECLARE l_http_request UTL_HTTP.REQ; soap_action VARCHAR2(200) := 'http://example.com/soap/action'; request_clob CLOB := '<soapenv:Envelope>...</soapenv:Envelope>'; l_header_count PLS_INTEGER; l_header_name VARCHAR2(256); l_header_value VARCHAR2(1024); BEGIN -- 初始化请求 l_http_request := UTL_HTTP.BEGIN_REQUEST('http://example.com/service'); -- 设置请求头 UTL_HTTP.set_header(l_http_request, 'Content-Type', 'text/xml;charset=UTF-8'); IF soap_action IS NOT NULL THEN UTL_HTTP.set_header(l_http_request, 'SOAPAction', soap_action); END IF; UTL_HTTP.set_header(l_http_request, 'Content-Length', LENGTH(request_clob)); -- 设置Basic认证和Keep-Alive UTL_HTTP.set_authentication(l_http_request, 'username', 'password'); UTL_HTTP.set_header(l_http_request, 'Connection', 'keep-alive'); -- 遍历打印所有请求头 l_header_count := UTL_HTTP.GET_HEADER_COUNT(l_http_request); DBMS_OUTPUT.PUT_LINE('=== 已配置的请求头 ==='); FOR i IN 1..l_header_count LOOP UTL_HTTP.GET_HEADER(l_http_request, i, l_header_name, l_header_value); DBMS_OUTPUT.PUT_LINE(l_header_name || ': ' || l_header_value); END LOOP; UTL_HTTP.END_REQUEST(l_http_request); EXCEPTION WHEN OTHERS THEN IF UTL_HTTP.IS_OPEN(l_http_request) THEN UTL_HTTP.END_REQUEST(l_http_request); END IF; RAISE; END; /
方法二:启用UTL_HTTP调试日志
如果需要查看完整的请求细节(包括请求行、头、请求体),可以开启调试模式,将日志输出到DBMS_OUTPUT:
-- 开启调试输出,级别4表示打印所有请求响应细节 UTL_HTTP.SET_DEBUG_LEVEL(4); UTL_HTTP.SET_DEBUG_OUTPUT(UTL_HTTP.DBMS_OUTPUT); -- 后续执行请求初始化、设置头、发送请求的代码,调试信息会自动输出
注意事项
- 执行用户需要有
UTL_HTTP的EXECUTE权限;如果使用文件输出调试日志,还需要UTL_FILE相关权限。 - 调试模式会打印敏感信息(如Basic认证的密码),生产环境使用后务必关闭。
内容的提问来源于stack exchange,提问作者chiranth
相关产品推荐
相关产品推荐

