UTL_HTTP 包

UTL_HTTP 包提供了通过HTTP协议获取网页内容的功能。

UTL_HTTP包中各函数的调用顺序如下图所示。另外,REQUEST函数是独立于流程图之外的,相当于使用流程图中各函数的缺省配置,最终返回指定网页的前2000个字节。

UTL_HTTP包中函数使用顺序图

图 UTL_HTTP包中函数使用顺序图

36.1 相关方法

下面对各个函数和过程进行详细说明。

  1. REQ

定义REQ为RECORD类型,用来存放请求消息。

语法如下:

TYPE req IS RECORD (

	url VARCHAR2(32767),

	method VARCHAR2(64),

	http_version VARCHAR2(64)

);

参数详解

  • url web服务器的url地址。url中可以包含用户名密码。
  • method 对指定url发起的操作命令。 常见的命令有get、post,默认为Get。
  • http_version
    http协议版本号,UTL_HTTP包提供1.0和1.1两个版本宏定义,若此参数设为NULL,则默认使用最新的http协议版本。此参数默认为NULL。
  1. RESP

定义RESP为RECORD类型,用来存放响应消息。

语法如下:

TYPE resp IS RECORD (

	status_code PLS_INTEGER,

	reason_phrase VARCHAR2(256),

	http_version VARCHAR2(64)

);

参数详解

  • STATUS_CODE web服务器返回的状态码。
  • REASON_PHRASE 关于状态码的简单文本描述。
  • HTTP_VERSIONhttp协议版本号,UTL_HTTP包提供1.0和1.1两个版本宏定义,若此参数设为NULL,则默认使用最新的http协议版本。此参数默认为NULL。
  1. BEGIN_REQUEST

用于发起一个新的http请求。单个会话若调用BEGIN_REQUEST后未调用END_REQUEST结束,则最多同时发起5个http请求。

语法如下:

FUNCTION BEGIN_REQUEST (

	url IN VARCHAR2,

	method IN VARCHAR2 DEFAULT 'GET',

	http_version IN VARCHAR2 DEFAULT NULL,

	request_context IN request_context_key DEFAULT NULL)

RETURN req;

参数详解

  • url web服务器的url地址。url中可以包含用户名密码。
  • method对指定url发起的操作命令。
  • http_versionhttp协议版本号,UTL_HTTP包提供1.0和1.1两个版本宏定义,若此参数设为NULL,则默认使用最新的http协议版本。此参数默认为NULL。
  • request_context目前达梦不支持此参数,仅用作兼容参数。

返回值

HTTP请求消息。

  1. END_REQUEST

用于结束http请求。

语法如下:

PROCEDURE END_REQUEST (

	r IN OUT NOCOPY req

);

参数详解

  • R http请求句柄。
  1. GET_RESPONSE

用于读取http响应消息。

语法如下:

FUNCTION GET_RESPONSE (

	r IN OUT NOCOPY req)

RETURN resp;

参数详解

  • R http请求消息。

返回值

HTTP请求句柄。

  1. END_RESPONSE

用于结束http响应操作。

语法如下:

PROCEDURE END_RESPONSE (

	r IN OUT NOCOPY resp

);

参数详解

  • R http响应句柄。
  1. WRITE_TEXT

用于向http请求body中填写数据。

语法如下:

PROCEDURE WRITE_TEXT(

	r IN OUT NOCOPY REQ,

	data IN VARCHAR2 CHARACTER SET ANY_CS

);

参数详解

  • R http请求消息。
  • DATA准备向body写入的数据。
  1. READ_TEXT

用于读取http响应消息中body的内容并将内容输出到指定的缓冲区中。body中的数据将自动转换成数据库所指定的字符集。

语法如下:

PROCEDURE READ_TEXT(

	r IN OUT NOCOPY resp,

	data OUT NOCOPY VARCHAR2 CHARACTER SET ANY_CS,

	len IN PLS_INTEGER DEFAULT NULL

);

参数详解

  • Rhttp请求消息。
  • DATA 读取body中的数据。
  • LEN请求读取的数据长度
  1. SET_HEADER

用于设置http请求的头信息。设置头信息的请求将被立即发送到web服务器。

语法如下:

PROCEDURE SET_HEADER (

	r IN OUT NOCOPY req,

	name IN VARCHAR2,

	value IN VARCHAR2

);

参数详解

  • R http请求消息。
  • NAME header中请求设置的属性名。
  • VALUE header中请求设置的属性值。
  1. GET_HEADER

用于获取http响应头信息。过程将响应头中的第n个属性名及属性值返回。

语法如下:

PROCEDURE GET_HEADER (

	r IN OUT NOCOPY resp,

	n IN PLS_INTEGER,

	name OUT NOCOPY VARCHAR2,

	value OUT NOCOPY VARCHAR2

);

参数详解

  • R http响应消息。
  • N header中的第n个属性。
  • NAME属性名。
  • VALUE属性值。
  1. SET_BODY_CHARSET

用于设置body的字符集,至于是请求还是响应消息中的body,则需要看上下文。

语法如下:

PROCEDURE SET_BODY_CHARSET (

charset IN VARCHAR2 DEFAULT NULL

);

或者

PROCEDURE SET_BODY_CHARSET(

r IN OUT NOCOPY req,
charset IN VARCHAR2 DEFAULT NULL

);

或者

PROCEDURE SET_BODY_CHARSET(

r IN OUT NOCOPY resp,
charset IN VARCHAR2 DEFAULT NULL

);

  • R http请求(或响应)句柄。
  • CHARSET字符集名称。
  1. SET_AUTHENTICATION

用于设置http请求消息中的权限。WEB服务器需要这些权限信息用于授权访问。

语法如下:

PROCEDURE SET_AUTHENTICATION(

	r IN OUT NOCOPY req,

	username IN VARCHAR2,

	password IN VARCHAR2,

	scheme IN VARCHAR2 DEFAULT 'Basic',

	for_proxy IN BOOLEAN DEFAULT FALSE

);

参数详解

  • R http请求消息。
  • USENAME web服务器端所需的用户名。
  • PASSWORD web服务器端所需的密码。
  • SCHEME访问模式,仅支持"basic"。
  • FOR_PROXY是否通过代理来访问web,默认为FALSE。
  1. GET_AUTHENTICATION

从http响应消息中获取WEB服务器所需要的授权信息。

语法如下:

PROCEDURE GET_AUTHENTICATION(

	r IN OUT NOCOPY resp,

	scheme OUT VARCHAR2,

	realm OUT VARCHAR2,

	for_proxy IN BOOLEAN DEFAULT FALSE

)
;

参数详解

  • R http响应消息。
  • SCHEME web服务器的授权模式。
  • REALM web服务器需要授权的区域。
  • FOR_PROXY是否返回访问代理所需的权限而不是WEB服务器的权限,默认FALSE。
  1. REQUEST

返回网页的前2000个字节。该函数可以直接用在SQL查询中。

语法如下:

FUNCTION REQUEST (

url IN VARCHAR2

)RETURN req;

参数详解

url web服务器的url地址。url中可以包含用户名密码。

返回值

返回网页的前2000个字节。

36.2 举例说明

使用包内的过程和函数之前,如果还未创建过系统包。请先调用系统过程创建系统包。

SP_CREATE_SYSTEM_PACKAGES (1,'UTL_HTTP');

SP_CREATE_SYSTEM_PACKAGES (1,'DBMS_OUTPUT');

SET SERVEROUTPUT ON; --dbms_output.put_line需要设置这条语句,才能打印出消息

举一个使用UTL_HTTP包获取网页信息的例子。

declare

req utl_http.REQ;

resp utl_http.resp;

data varchar2(32563);

receiveDate varchar;

begin

req :=utl_http.begin_request('http://192.168.0.104/blog/2015_06_05/CSDN_public_1433381803730.html','POST');

data := ' ';

utl_http.write_text(req, data);

resp := utl_http.get_response(req);

utl_http.set_body_charset(resp, 'utf-8');

utl_http.read_text(resp, receiveDate, 1024);

dbms_output.put_line(receiveDate);

utl_http.end_response(resp);

end;

输出的网页内容为:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="www.w3.org/1999/xhtml">

<head>

<script type="text/javascript" src="c.csdnimg.cn/pubfooter/js/tracking.js"
charset="utf-8"></script>

<script type="text/javascript">

var protocol = window.location.protocol;

document.write('<script type="text/javascript"
src="csdnimg.cn/pubfooter/js/repoAddr2.js?v=' + Math.random() + '"></' +'script>');

</script>

<script id="allmobilize" charset="utf-8"
src="a.yunshipei.com/46aae4d1e2371e4aa769798941cef698/allmobilize.min.js"></script>

<meta http-equiv="Cache-Control" content="no-siteapp">

<link rel="alternate" media="handheld" href="##">

<title>使用UTL_HTTP包获取网页内容 - IndexMan的专栏

- 博客频道 - CSDN.NET</title>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

<meta name="description" content="UTL_HTTP
包提供了容易的方式通过HTTP协议获取网页内容
微信扫码
分享文档
扫一扫
联系客服