Программирование >>  Oracle 

1 ... 441 442 443 [ 444 ] 445 446 447 ... 469


Пакет UTL HTTP

В этом разделе мы рассмотрим, когда и как использовать пакет UTL HTTP. Кроме того, я хочу представить новую расширенную версию пакета UTL HTTP, созданную на основе типа SocketType, который рассматривается в разделе, посвященном пакету UTL TCP. Его производительность сравнима с обеспечиваемой стандартным пакетом UTL HTTP, а возможности - намного шире.

Стандартный пакет UTL HTTP, поставляемый вместе с сервером, реализует весьма упрощенный подход. Он содержит две функции.

UTL HTTP.REQUEST: возвращает до 2000 первых байт содержимого с заданным адресом URL.

UTL HP.REQUEST PIECES: возвращает PL/SQL-таблицу элементов типа VARCHAR2(2000). Если конкатенировать последовательно все элементы, будет получено содержимое соответствующей страницы.

В пакете UTL HTTP, однако, не хватает многих возможностей.

Нельзя проверить заголовки HTTP. Это не позволяет выдавать сообщения об ошибках. Нельзя, например, различить ошибки доступа Not Found и Unauthorized.

Нельзя перес1лать информацию на Web-сервер с помощью метода POST. Можно использовать только метод GET. Кроме того, не поддерживается метод HEAD протокола HTTP.

С помощью пакета UTL HTTP нельзя получать двоичные данные.



1756 Приложение

Интерфейс запроса страницы по частям (REQUEST PIECES) неочевиден - намного проще б1ло бы использовать данные типа CLOB или BLOB для возврата данных в виде потока (что обеспечило бы заодно и доступ к двоичным данным).

Пакет не поддерживает ключики (cookies).

Пакет не поддерживает даже простейшую аутентификацию.

В пакете нет методов кодирования адреса URL.

Одна из возможностей, которые пакет UTL HTTP поддерживает, - это использование протокола SSL. C помощью диспетчера Oracle Wallet можно выполнять запросы по протоколу HTTPS (HTTPS - это реализация протокола HTTP поверх SSL). Я продемонстрирую использование пакета UTL HTTP для доступа по протоколу SSL, но соответствующие возможности в пакете HTTP PKG реализовывать не будем. Полный текст пакета HTTP PKG вследствие большого размера в этом разделе не приводится; он доступен на сайте издательства Wrox по адресу http: www.wrox.com.

Возможности пакета UTL HTTP

Рассмотрим сначала функциональные возможности пакета UTL HP, поскольку предполагается реализовать аналогичные в пакете HTTP PKG. Простейший вариант использования средств пакета UTL HTTP представлен далее. В этом примере myserver - имя моего Web-сервера. Вы, разумеется, должны выполнить этот пример, обращаясь в Web-серверу, который вам доступен:

ops$tkyte@DEV816>select utl http.request(http: myserver/) from dual;

UTL HTTP.REQUEST(HTTP: MYSERVER/)

<HTML> <HEAD>

<TITLE>OracleServiceIndustries</TITLE> </HEAD>

<FRAMESET COLS= 13 0,* border=0>

<FRAME SRC= navtest.html NAME= sidebar frameborder=0>

<FRAME SRC= folder home.html NAME= body frameborder= 0

marginheight = 0 marginwidth= 0 >

</FRAMESET>

</BODY>

</HTML>

Можно просто вызвать функцию UTL HTTP.REQUEST, передав ей адрес URL. Пакет UTL HP подключится к соответствующему Web-серверу и запросит (GET) указанную страницу, а затем вернет первые 2000 ее символов. Как уже б1ло сказано, не пытайтесь использовать указанный в примере адрес URL - это адрес моего рабочего Web-сервера в корпорации Oracle. Вы не сможете к нему добраться - по истечении времени ожидания будет выдано сообщение об ошибке.

Большинство сетей сегодня защищено брандмауэрами (межсетевыми экранами). Если необходимая страница доступна только через промежуточный сервер брандмауэра, я мог



Пакет UTL HTTP 1757

бы запросить ее и так. Обсуждение брандмауэров и промежуточных серверов выходит за рамки этой книги. Однако если известно имя хоста, на котором работает промежуточный сервер, можно выбрать через него страницу из Internet следующим образом:

ops$tkyte@DEV816> select utl http.request(http: www.yahoo.com, www-> proxy) from dual;

UTL HTTP.REQUEST(HTTP: WWW.YAHOO.COM,WWW-PROXY)

<html><head><title>Yahoo!</title><base href=http: www.yahoo.com/><meta http-equiv= PICS-Label content=(PICS-l.l http: www.rsac.org/ ratingsv0l.html 1 gen true for http: www.yahoo.com r (n 0 s 0 v 0 1 0))></head><bodyXcenter><form action=http: search.yahoo.com/bin/ search><map name=m><area coords= 0,0,52,52 href=r/al><area coords= 53,0,121,52 href=r/pl><area coords= 122,0,191,52 href=r

Второй параметр функций UTLHTTP.REQUEST и REQUESTPIECES - имя промежуточного сервера. Если промежуточный сервер работает не на стандартном порту (80), можно добавить номер порта следующим образом (в коде промежуточный сервер - myserver, и работает он на порту 8000):

ops$tkyte@DEV816> select utl http.request(http: www.yahoo.com,

2 myserver:8000) from dual

UTL HTTP.REQUEST(HTTP: WWW.YAHOO.COM,MYSERVER:8000)

<html><head><title>Yahoo!</title><base href=http: www.yahoo.com/ Итак, добавив :8000 к имени промежуточного сервера, мы смогли к нему подключиться. Теперь давайте рассмотрим использование функции REQUESTPIECES:

ops$tkyte@DEV816> declare

2 pieces utl http.html pieces;

3 n number default 0;

4 l start number default dbms utility.get time;

5 begin

6 pieces :=

7 utl http.request pieces(url => http: vww.oracle.com/,

8 max pieces => 99999,

9 proxy = > www-proxy);

10 for i in 1 .. pieces.count

11 loop

12 loop

13 exit when pieces(i) is null;

14 dbms output.put line(substr(pieces(i),l,255));

15 pieces(i) := substr(pieces(i), 2 56);

16 end loop;

17 end loop;

18 end;

19 /

<head>



1 ... 441 442 443 [ 444 ] 445 446 447 ... 469

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика