Oracle9i Supplied PL/SQL Packages and Types Reference Release 2 (9.2) Part Number A96612-01 |
|
The UTL_HTTP
package makes Hypertext Transfer Protocol (HTTP) callouts from SQL and PL/SQL. You can use it to access data on the Internet over HTTP.
With UTL_HTTP, you can write PL/SQL programs that communicate with Web (HTTP) servers. UTL_HTTP
also contains a function that can be used in SQL queries. The package also supports HTTP over the Secured Socket Layer protocol (SSL), also known as HTTPS, directly or through an HTTP proxy. Other Internet-related data-access protocols (such as the File Transfer Protocol (FTP) or the Gopher protocol) are also supported using an HTTP proxy server that supports those protocols.
When the package fetches data from a Web site using HTTPS, it requires Oracle Wallet Manager to set up an Oracle wallet. Non-HTTPS fetches do not require an Oracle wallet.
See Also:
|
This chapter discusses the following topics:
Use the following types with UTL_HTTP
.
Use this PL/SQL record type to represent an HTTP request.
TYPE req IS RECORD ( url VARCHAR2(32767), method VARCHAR2(64), http_version VARCHAR2(64), );
The information returned in REQ
from the API begin_request
is for read only. Changing the field values in the record has no effect on the request.
There are other fields in REQ
record type whose names begin with the prefix private_.
The fields are private and are intended for use by implementation of the UTL_HTTP
package. You should not modify the fields.
This PL/SQL record type is used to represent an HTTP response.
TYPE resp IS RECORD ( status_code PLS_INTEGER, reason_phrase VARCHAR2(256), http_version VARCHAR2(64), );
The information returned in RESP
from the API get_response
is read-only. There are other fields in the RESP
record type whose names begin with the prefix private_.
The fields are private and are intended for use by implementation of the UTL_HTTP
package. You should not modify the fields.
The COOKIE
type is the PL/SQL record type that represents an HTTP cookie. The COOKIE_TABLE
type is a PL/SQL index-by-table type that represents a collection of HTTP cookies.
TYPE cookie IS RECORD ( name VARCHAR2(256), value VARCHAR2(1024), domain VARCHAR2(256), expire TIMESTAMP WITH TIME ZONE, path VARCHAR2(1024), secure BOOLEAN, version PLS_INTEGER, comment VARCHAR2(1024) ); TYPE cookie_table IS TABLE OF cookie INDEX BY binary_integer;
Table 96-4 shows the fields for the COOKIE and COOKIE_TABLE record types.
PL/SQL programs do not usually examine or change the cookie information stored in the UTL_HTTP
package. The cookies are maintained by the package transparently. They are maintained inside the UTL_HTTP
package, and they last for the duration of the database session only. PL/SQL applications that require cookies to be maintained beyond the lifetime of a database session can read the cookies using get_cookies,
store them persistently in a database table, and re-store the cookies back in the package using add_cookies
in the next database session. All the fields in the cookie
record, except for the comment field, must be stored. Do not alter the cookie information, which can result in an application error in the Web server or compromise the security of the PL/SQL and the Web server applications. See "Example: Retrieving and Restoring Cookies".
Use this PL/SQL record type to represent the remote hosts and TCP/IP ports of a network connection that is kept persistent after an HTTP request is completed, according to the HTTP 1.1 protocol specification. The persistent network connection may be reused by a subsequent HTTP request to the same host and port. The subsequent HTTP request may be completed faster because the network connection latency is avoided. connection_table
is a PL/SQL table of connection
.
For a direct HTTP persistent connection to a Web server, the host
and port
fields contain the host name and TCP/IP port number of the Web server. The proxy_host
and proxy_port
fields are not set. For an HTTP persistent connection that was previously used to connect to a Web server using a proxy, the proxy_host
and proxy_port
fields contain the host name and TCP/IP port number of the proxy server. The host and port fields are not set, which indicates that the persistent connection, while connected to a proxy server, is not bound to any particular target Web server. An HTTP persistent connection to a proxy server can be used to access any target Web server that is using a proxy.
The ssl
field indicates if Secured Socket Layer (SSL) is being used in an HTTP persistent connection. An HTTPS request is an HTTP request made over SSL. For an HTTPS (SSL) persistent connection connected using a proxy, the host and port fields contain the host name and TCP/IP port number of the target HTTPS Web server and the fields will always be set. An HTTPS persistent connection to an HTTPS Web server using a proxy server can only be reused to make another request to the same target Web server.
TYPE connection IS RECORD ( host VARCHAR2(256), port PLS_INTEGER, proxy_host VARCHAR2(256), proxy_port PLS_INTEGER, ssl BOOLEAN ); TYPE connection_table IS TABLE OF connection INDEX BY BINARY_INTEGER;
The UTL_HTTP
package provides access to the HTTP protocol. The API must be called in the order shown in Figure 96-1, or an exception will be raised.
The following can be called at any time:
UTL_HTTP
package in the current session
UTL_HTTP
package in the current session
Table 96-5 lists the exceptions that the UTL_HTTP
package API can raise. By default, UTL_HTTP
raises the exception request_failed
when a request fails to execute. If the package is set to raise a detailed exception by set_detailed_excp_support
, the rest of the exceptions will be raised directly (except for the exception end_of_body
, which will be raised by read_text
, read_line
, and read_raw
regardless of the setting).
For REQUEST and REQUEST_PIECES(), the request_failed
exception is raised when any exception occurs and detailed_exception
is disabled.
The following examples demonstrate how to use UTL_HTTP.
SET serveroutput ON SIZE 40000 DECLARE req utl_http.req; resp utl_http.resp; value VARCHAR2(1024); BEGIN utl_http.set_proxy('proxy.my-company.com', 'corp.my-company.com'); req := utl_http.begin_request('http://www-hr.corp.my-company.com'); utl_http.set_header(req, 'User-Agent', 'Mozilla/4.0'); resp := utl_http.get_response(req); LOOP utl_http.read_line(resp, value, TRUE); dbms_output.put_line(value); END LOOP; utl_http.end_response(resp); EXCEPTION WHEN utl_http.end_of_body THEN utl_http.end_response(resp); END;
SET serveroutput ON SIZE 40000 DECLARE req utl_http.req; resp utl_http.resp; name VARCHAR2(256); value VARCHAR2(1024); BEGIN utl_http.set_proxy('proxy.my-company.com', 'corp.my-company.com'); req := utl_http.begin_request('http://www-hr.corp.my-company.com'); utl_http.set_header(req, 'User-Agent', 'Mozilla/4.0'); resp := utl_http.get_response(req); dbms_output.put_line('HTTP response status code: ' || resp.status_code); dbms_output.put_line('HTTP response reason phrase: ' || resp.reason_phrase); FOR i IN 1..utl_http.get_header_count(resp) LOOP utl_http.get_header(resp, i, name, value); dbms_output.put_line(name || ': ' || value); END LOOP; utl_http.end_response(resp); END;
SET serveroutput ON SIZE 40000 CREATE OR REPLACE PROCEDURE get_page (url IN VARCHAR2, username IN VARCHAR2 DEFAULT NULL, password IN VARCHAR2 DEFAULT NULL, realm IN VARCHAR2 DEFAULT NULL) AS req utl_http.req; resp utl_http.resp; my_scheme VARCHAR2(256); my_realm VARCHAR2(256); my_proxy BOOLEAN; BEGIN -- Turn off checking of status code. We will check it by ourselves. utl_http.http_response_error_check(FALSE); req := utl_http.begin_request(url); IF (username IS NOT NULL) THEN utl_http.set_authentication(req, username, password); -- Use HTTP Basic Authen. Scheme END IF; resp := utl_http.get_response(req); IF (resp.status_code = utl_http.HTTP_UNAUTHORIZED) THEN utl_http.get_authentication(resp, my_scheme, my_realm, my_proxy); IF (my_proxy) THEN dbms_output.put_line('Web proxy server is protected.'); dbms_output.put('Please supplied the required ' || my_scheme || ' authentication username/password for realm ' || my_realm || ' for the proxy server.'); ELSE dbms_output.put_line('Web page ' || url || ' is protected.'); dbms_output.put('Please supplied the required ' || my_scheme || ' authentication username/password for realm ' || my_realm || ' for the Web page.'); END IF; utl_http.end_response(resp); RETURN; END IF; FOR i IN 1..utl_http.get_header_count(resp) LOOP utl_http.get_header(resp, i, name, value); dbms_output.put_line(name || ': ' || value); END LOOP; utl_http.end_response(resp); END;
CREATE TABLE my_cookies ( session_id BINARY_INTEGER, name VARCHAR2(256), value VARCHAR2(1024), domain VARCHAR2(256), expire DATE, path VARCHAR2(1024), secure VARCHAR2(1), version BINARY_INTEGER ); CREATE SEQUENCE session_id; SET serveroutput ON SIZE 40000 REM Retrieve cookies from UTL_HTTP CREATE OR REPLACE FUNCTION save_cookies RETURN BINARY_INTEGER AS cookies utl_http.cookie_table; my_session_id BINARY_INTEGER; secure VARCHAR2(1); BEGIN /* assume that some cookies have been set in previous HTTP requests. */ utl_http.get_cookies(cookies); select session_id.nextval into my_session_id from dual; FOR i in 1..cookies.count LOOP IF (cookies(i).secure) THEN secure := 'Y'; ELSE secure := 'N'; END IF; insert into my_cookies value (my_session_id, cookies(i).name, cookies(i).value, cookies(i).domain, cookies(i).expire, cookies(i).path, secure, cookies(i).version); END LOOP; RETURN my_session_id; END; REM Retrieve cookies from UTL_HTTP CREATE OR REPLACE PROCEDURE restore_cookies (this_session_id IN BINARY_INTEGER) AS cookies utl_http.cookie_table; cookie utl_http.cookie; i PLS_INTEGER := 0; CORSOR c (c_session_id BINARY_INTEGER) IS SELECT * FROM my_cookies WHERE session_id = c_session_id; BEGIN FOR r IN c(this_session_id) LOOP i := i + 1; cookie.name := r.name; cookie.value := r.value; cookie.domain := r.domain; cookie.expire := r.expire; cookie.path := r.path; IF (r.secure = 'Y') THEN cookie.secure := TRUE; ELSE cookie.secure := FALSE; END IF; cookie.version := r.version; cookies(i) := cookie; END LOOP; utl_http.clear_cookies; utl_http.add_cookies(cookies); END;
|
Copyright © 2000, 2002 Oracle Corporation. All Rights Reserved. |
|