为啥 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_Msg 和 v_Status_Code 的记录输出。
如果我能提供帮助,我会很高兴。
【讨论】:
以上是关于为啥 HTTP 请求在 UTL_hhtp oracle 包上反复失败?的主要内容,如果未能解决你的问题,请参考以下文章
如果我在使用 cors 时添加标准 http 标头,为啥会预检请求?