我使用UTL_HTTP从Oracle 11g调用Web服务。我确信我的证书和钱包已正确设置,可通过HTTPS进行连接。该呼叫一致地用于有效的业务数据。
当我传递无效数据(在这种情况下是不存在的用户ID)时,对UTL_HTTP.GET_RESPONSE的调用会引发异常:
ORA-29273: HTTP request failed
ORA-06512: at "SYS.UTL_HTTP", line 1369
ORA-29263: HTTP protocol error
我没有返回UTL_HTTP.RESP对象来调查任何HTTP错误代码或内容。许多其他无效数据用例已返回带有错误代码的响应,但这些没有抛出异常。我能够处理HTTP错误代码的响应并从响应正文中获取错误消息。
在抛出异常的特定情况下我注意到的是:
我通过curl调用发现了这些。这些条件中的任何一个都可能是UTL_HTTP.GET_RESPONSE抛出HTTP协议错误的原因吗?
感谢。
答案 0 :(得分:0)
ORA-29263: HTTP protocol error
会出现在以下情况中: -
案例1:网址不是https 。
- >检查网址并确保其为 https ,而不是http。
案例2:钱包证书设置不正确。
答案 1 :(得分:0)
除非您要求Oracle更加明确,否则utl_http
引发的错误是故意不透明的。
要在出现异常时使错误消息更详细,请在您的会话中调用
utl_http.set_response_error_check(true)
否则,根据utl_http
包中的文档,利用异常处理代码中的以下方法,您可能会出错:
utl_http.get_detailed_sqlcode
utl_http.get_detailed_sqlerrm
对于处理大型请求,如果这是您的真正问题,则将响应分块并将其堆积在Clob中可能会解决您的问题:
function get_request(p_url varchar2, p_payload_text varchar2)
return clob
is
v_req utl_http.req;
v_resp utl_http.resp;
v_req varchar2(32767);
v_resp clob;
v_resp_chunked varchar2(32767);
v_xml_resp xmltype;
begin
utl_http.set_response_error_check(true);
v_req := utl_http.begin_request(
url => p_url
, method => 'POST'
, http_version => 'HTTP/1.1'
);
utl_http.set_body_charset(v_req, 'UTF-8');
utl_http.set_persistent_conn_support(false, 0);
utl_http.set_header(v_req, 'Content-Type', 'text/xml;charset=UTF-8');
utl_http.set_header(v_req, 'Content-Length', length(p_payload_text));
utl_http.write_text(v_req, p_payload_text);
v_resp := utl_http.get_response(v_req);
dbms_output.put_line(v_resp_chunked);
dbms_lob.createtemporary(v_resp,true, dbms_lob.session);
begin
loop
utl_http.read_text(v_resp, v_resp_chunked, 32767);
--dbms_output.put_line(v_resp_chunked);
dbms_lob.append(v_resp, v_resp_chunked);
end loop;
exception
when utl_http.end_of_body or UTL_HTTP.TOO_MANY_REQUESTS then
utl_http.end_response(v_resp);
dbms_output.put_line('mess:' ||SQLERRM);
end;
dbms_lob.freetemporary(v_resp);
return v_resp;
end;
答案 2 :(得分:-1)
您是否使用类似UTL_ENCODE.BASE64_ENCODE的内容来构建请求?尝试使用修复请求字符串 REPLACE(your_request,UTL_TCP.CRLF,'');