为啥 HTTP 请求在 UTL_hhtp oracle 包上反复失败?

Posted

技术标签:

【中文标题】为啥 HTTP 请求在 UTL_hhtp oracle 包上反复失败?【英文标题】:why HTTP request failed repeatedly on UTL_hhtp oracle package?为什么 HTTP 请求在 UTL_hhtp oracle 包上反复失败? 【发布时间】:2021-09-10 10:34:59 【问题描述】:

亲爱的,我有一个 oracle 包,我从 tomcat 服务器请求一些 http 请求,我正在使用 UTL_HTTP 包来这样做, 现在请求正在成功运行 请求的代码是:

REQ := UTL_HTTP.BEGIN_REQUEST(URL,'POST','HTTP/1.1')
UTL_HTTP.SET_HEADER(REQ,'USER-AGENT','MOZILLA/4.0')
UTL_HTTP.SET_HEADER(REQ,'CONENT-LENGT',LENGTH(V_BODY)
UTL_HTTP.SET_HEADER(REQ,'CONTENT-TYPE','APPLICATION/JSON')
UTL_HTTP.SET_HEADER(REQ,'SDATE','01/06/2021')
UTL_HTTP.WRITE_TEXT(REQ,BODY);
RES:= UTL_HTTP.GET_RESPONSE(REQ);
UTL_HTTP.SET_BODY_CHARSET(R => RES, CHARSET => 'UTF-8');
UTL_HTTP.READ_TEXT(RES,BUFFER);
UTL_HTTP.END_REQUEST(REQ);
UTL_HTTP.END_RESPONSE(RES);

问题是大约 20% 的请求返回“http failed request” ORA-29273 任何帮助确定问题可能出在哪里,我已经做了一些研究,但没有什么帮助...提前谢谢。

【问题讨论】:

您是否检查过响应返回的 HTTP 代码?如果您从不检查远程服务器上的请求是否失败,并且返回的响应中的 HTTP 代码不在 200 秒内(即不成功),那么 HTTP 请求当然会失败。您需要优雅地处理远程故障。 @MTO 亲爱的,你说得对,我应该进行检查,但错误似乎发生在我得到响应之前,并且在此之前引发的异常我的意思是当我试图得到响应时错误出现 【参考方案1】:

我也遇到过这样的问题,在这种情况下,我想你不会得到请求的 status_code,但是你可以阅读请求的详细错误。

你应该从

捕获异常
RES:= UTL_HTTP.GET_RESPONSE(REQ);

我的代码版本:

begin
       RES:= UTL_HTTP.GET_RESPONSE(REQ);
       v_Status_Code := RES.Status_Code;
     exception
       when others then
          o_Ora_Msg := sqlerrm;
  
           if RES.Reason_Phrase is not null then
             o_Ora_Msg := o_Ora_Msg || ',  http read error Reason_Phrase: ' || RES.Reason_Phrase;
           end if;
    
           if RES.Private_Hndl is not null then
             o_Ora_Msg := o_Ora_Msg || ',  Private_Hndl: ' || RES.Private_Hndl;
           end if;
    
           if Utl_Http.Get_Detailed_Sqlerrm is not null then
             o_Ora_Msg := o_Ora_Msg || ',  Get_Detailed_Sqlerrm: ' || Utl_Http.Get_Detailed_Sqlerrm;
           end if;
    
           if Utl_Http.Get_Detailed_Sqlcode is not null then
             o_Ora_Msg := o_Ora_Msg || ', Get_Detailed_Sqlcode: ' || Utl_Http.Get_Detailed_Sqlcode;
           end if;
    
           begin
             v_Status_Code := RES.Status_Code;
           exception
             when others then
               v_Status_Code := -1;
           end;
  
           if v_Status_Code is null then
             v_Status_Code := -5;
           end if;
 end;

定义问题的唯一方法是得到详细的错误,然后你可以分析其余的。

您应该检查 o_Ora_Msgv_Status_Code 的记录输出。

如果我能提供帮助,我会很高兴。

【讨论】:

以上是关于为啥 HTTP 请求在 UTL_hhtp oracle 包上反复失败?的主要内容,如果未能解决你的问题,请参考以下文章

为啥请求 http 在 Kotlin 中不起作用?

如果我在使用 cors 时添加标准 http 标头,为啥会预检请求?

为啥http请求响应没有以角度2显示?

当我使用 HTTP 协议尝试请求时,为啥会收到错误的请求响应?

为啥我的 http 请求正文没有传输到服务器?

为啥 HTTP 请求永远不会通过异步等待返回?