为什么UTL_HTTP.GET_RESPONSE会抛出HTTP协议错误

3

我正在使用UTL_HTTP从Oracle 11g调用一个webservice。 我确信我的证书和钱包已正确设置,以便通过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错误代码并从响应正文中获取错误消息。
在抛出异常的特定情况下,我注意到以下情况:
- 响应正文比其他情况要大,约2600个字节。 - 响应正文包含和号(它是带有转义XML内容的HTML响应。我无法控制服务器响应)
我通过curl调用时发现了这些问题。这两个条件中的任何一个都可能是UTL_HTTP.GET_RESPONSE抛出HTTP协议错误的原因吗?
谢谢。
3个回答

1

看起来utl_http引发的错误是有意模糊的,除非你要求Oracle更明确一些。

为了在引发异常时使错误消息更加详细,请在会话中的某个地方调用:

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;

0

ORA-29263: HTTP协议错误会在以下情况下抛出:

  • 情况一:URL不是https
    --> 检查URL并确保其为https而不是http。

  • 情况二:钱包证书未正确设置。


-1

你是否使用类似UTL_ENCODE.BASE64_ENCODE的东西来构建请求?尝试使用REPLACE(your_request, UTL_TCP.CRLF, '')来修复请求字符串。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接