关于oracle中utl_http,Oracle使用utl_http访问webservice

PLSQL访问webservice, utl_dbws是个不错的选择,另外的一种方式是直接构造http请求访问。

这里,使用了utl_http工具包,并使用了XMLTABLE+XPATH获取请求的结果。

另外,普通数据库用户需要预先授权。

代码如下:

DECLARE

req     utl_http.req;

resp    utl_http.resp;

v_msg   VARCHAR2(80);

v_url   VARCHAR2(32767) := '';

v_name  VARCHAR2(32767);

v_value VARCHAR2(32767);

v_clob_content CLOB;

--这里是请求的内容

v_content VARCHAR2(32767) := '

';

v_xmltable xmltype;

BEGIN

--utl_http.set_response_error_check ( enable => true );

-- utl_http.set_detailed_excp_support ( enable => true );

--dbms_output.put_line('STATUS CODE: ' || 'resp.status_code');

req := utl_http.begin_request(v_url, 'POST', utl_http.http_version_1_1);

utl_http.set_header(req, 'Content-Type', 'text/xml; charset=utf-8');

--utl_http.set_header(req, 'Host', '220.168.42.13');

utl_http.set_header(req, 'Content-Length', length(v_content));

utl_http.write_text(req, v_content);

resp := utl_http.get_response(r => req);

dbms_output.put_line('STATUS CODE: ' || resp.status_code);

dbms_output.put_line('REASON PHRASE: ' || resp.reason_phrase);

BEGIN

LOOP

utl_http.read_line(resp, v_value, TRUE);

v_clob_content := v_clob_content || v_value;

--dbms_output.put_line(v_value);

END LOOP;

/*FOR i IN 1 .. utl_http.get_header_count(r => resp) LOOP

utl_http.get_header(r => resp,

n => i,

NAME => v_name,

VALUE => v_value);

dbms_output.put_line(v_name || ': ' || v_value);

END LOOP;*/

utl_http.end_response(r => resp);

EXCEPTION

WHEN OTHERS THEN

--dbms_output.put_line(SQLCODE || ':' || SQLERRM);

--dbms_output.put_line(dbms_utility.format_error_backtrace);

--dbms_output.put_line(dbms_utility.format_error_stack);

utl_http.end_response(r => resp);

END;

--dbms_output.put_line(v_clob_content);

/* v_clob_content := REPLACE(v_clob_content,

' SOAP-ENV:encodingStyle=" xmlns:SOAP-ENV=" xmlns:xsd=" xmlns:xsi=" xmlns:SOAP-ENC="',

'');

v_clob_content := REPLACE(v_clob_content,

' xmlns:ns1="',

'');

v_clob_content := REPLACE(v_clob_content, ' xsi:type="xsd:string"', '');

v_clob_content := REPLACE(v_clob_content, 'SOAP-ENV:', '');

v_clob_content := REPLACE(v_clob_content, 'ns1:', '');*/

--dbms_output.put_line(v_clob_content);

v_xmltable := xmltype(v_clob_content);

--这里解析返回的结果 如果有namespace需要在extract参数里声明。

--dbms_output.put_line(v_xmltable.extract('/soap:Envelope/soap:Body/svc_aboutResponse/svc_aboutResult/text()', 'xmlns:soap=" xmlns:xsi=" xmlns:xsd="')

--                     .getclobval());

dbms_output.put_line(v_xmltable.extract('/soap:Envelope/soap:Body/svc_aboutResponse/svc_aboutResult/text()', 'xmlns:soap=" xmlns:xsi=" xmlns:xsd=" xmlns="h2"').getclobval());

EXCEPTION

WHEN OTHERS THEN

dbms_output.put_line(SQLCODE || ':' || SQLERRM);

dbms_output.put_line(dbms_utility.format_error_backtrace);

dbms_output.put_line(dbms_utility.format_error_stack);

--utl_http.end_response(r => resp);

END;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值