|
Программирование >> Oracle
Пакет UTL HTTP 1767 26 l request := utl http.request 27 ( http: 127.0.0.1/cgi-bin/smail? l filename); 29 dbms output.put line(l request); 30 end sm; 31 / Procedure created. Чтобы понять, почему сообщение имеет именно такой формат, с заголовками From: и To:, обратитесь к разделу приложения, посвященному пакету UTL SMTP. В этой процедуре для генерации уникального имени файла используется последовательность. Адресата мы включаем в имя файла. Затем записываем сообщение в файл операционной системы. Наконец, используем функцию пакета UTLHTTP для выполнения соответствующей команды, и передаем ей имя созданного файла. В этом тестовом варианте мы просто выдаем возвращаемый функцией результат; на самом деле следовало бы проверять значение l result, чтобы определить, успешно отправлено ли сообщение. Соответствующая cgi-программа может иметь следующий вид: #!/bin/sh echo Content-type: text/plain echo echo $QUERY STRING to= echo $QUERY STRINGsed s/.*EMAIL\. echo $to (/usr/lib/sendmail $to < /tmp/$QUERY STRING) 1 >> /tmp/$$.log 2>&1 cat /tmp/$$.log rm /tmp/$$.log rm /tmp/$QUERY STRING Представленный сценарий командного интерпретатора начинает работу с выдачи заголовков HTTP, которые необходимы для возврата документа, - это и делают первые две команды echo. Затем выдается значение переменной QUERYSTRING (именно в нее Web-сервер поместит переданные данные, указанные после ? в адресе URL). Затем с помощью программы sed (Stream Editor - потоковый редактор) из строки QUERY STRING выбирается адрес электронной почты, и из имени файла удаляется все до строки EMAIL/ включительно. После этого мы выполняем команду sendmail в порожденном командном интерпретаторе, чтобы можно было перехватить ее стандартный выходной поток и стандартный поток ошибок. В стандартный выходной поток (с помощью cat) выдается содержимое журнала, полученного от программы sendmaiI. В данном случае я хочу возвращать в качестве содержимого Web-страницы результаты, переданные как в стандартный выходной поток, так и в стандартный поток ошибок, чтобы в PL/SQL-коде можно было проанализировать все сообщения об ошибках и т.п. Проще всего добиться этого, перенаправив оба потока во временный файл и выдав содержимое файла в стандартный выходной поток. В конце мы удаляем временные файлы и завершаем работу. Теперь можно протестировать эту процедуру: 1768 Приложение А scott@ORA8I.WORLD> begin 2 sm(tkyte6us.oracle.com, 3 tkyte6us.oracle.com, 4 testing, 5 hello world!) ; 6 end; m1.EMAIL.tkyte@us.oracle.com tkyte@us.oracle.com В результате выдано значение переменной среды QUERY STRING и адрес получателя, и, поскольку других сообщений (об ошибках) не выдано, мы знаем, что сообщение электронной почты отправлено. Итак, этот небольшой пример показывает, как использовать средства протокола UTL HTTP в целях, для которых они изначально не предназначены, - для выполнения команд операционной системы из PL/SQL-процедур. Для этого необходимо настроить специализированный Web-сервер на 1Р-адресе 127.0.0.1, сконфигурировать на нем каталог для cgi-программ и поместить в него команды, которые будут выполнять в нем разработчики PL/SQL-процедур. В результате получается безопасный способ выполнения аналога команды host утилиты SQL*Plus в языке PL/SQL. Улучшенная версия пакета UTL HTTP При наличии класса SocketType, который представлен в разделе, посвященном пакету UTL TCP (или при наличии хотя бы самого пакета UTL TCP), а также знании особенностей протокола HTTP, можно создать улучшенную версию пакета UTL HTTP. Мы назовем нашу реализацию HTTP PKG. Она будет поддерживать прежние интерфейсы пакета UTL HTTP, функции REQUEST и REQUEST PIECES, и, кроме того, обеспечит следующее. Получение HTTP-заголовков для каждого запроса. Эти заголовки содержат полезную информацию, в частности состояние запроса (например, 200 OK, 404 Not Found и так далее), имя сервера, предоставившего URL, тип возвращенного содержимого, ключики и т.д. Получение результатов в виде объекта типа CLOB или BLOB. Это позволит выбирать из PL/SQL большие PDF-файлы в таблицу, индексированную с помощью компонента interMedia; выбирать простой текст с другой страницы или получать двоичные данные, возвращаемые Web-сервером. В1полнение запросов HEAD для документа. Это позволит проверить, например, изменился ли документ, который вы загружали на прошлой неделе. Кодирование строк URL. Например, при наличии в адресе URL пробела или тильды (~) их необходимо маскировать. Пакет будет маскировать все символы, которые должны быть замаскированы. Пос1лка ключиков вместе с запросом. Если пакет HTTP PKG используется для обращения к Web-сайту, использующему аутентификацию на базе ключиков (cookie based authentication), эта возможность абсолютно необходима. Необходи- Пакет UTL HTTP 1769 мо выбрать (с помощью запроса GET) страницу регистрации, посылая в запросе имя пользователя и пароль. Затем необходимо обработать заголовки HTTP, возвращаемые для этой страницы, и извлечь соответствующий ключик. Это значение потребуется для идентификации при посылке последующих запросов. Поддержка метода пос1лки POST, а не только GET. Метод GET имеет ограничение на размер запроса, разное для различных Web-серверов. Обычно длина URL не должна превышать 1-2 Кбайт. Если необходимо передать большее значение, данные надо передавать с помощью метода POST. Метод POST не налагает ограничений на размер передаваемых данных. Все это можно реализовать на языке PL/SQL с помощью типа SocketType, рассмотренного в разделе, посвященном пакету UTL TCP, причем кода для этого придется написать сравнительно немного. Далее представлена спецификация нового пакета HTTP PKG. Мы рассмотрим только спецификацию и несколько примеров использования этого пакета. В книге не приведен код, реализующий тело пакета HTTP PKG. Этот код доступен и описан на сайте издательства Wrox, (http: www.wrox.com) - он занимает около 15 страниц печатного текста, поэтому и не приведен здесь. Спецификация пакета представлена ниже. Первые две функции, REQUEST и REQUEST PIECES, аналогичны (за исключением поддержки SSL) одноименным функциям пакета UTL HTTP в версиях 7.3.x, 8.0.x и 8.1.5, - мы даже возбуждаем исключительные ситуации с теми же именами: tkyte@TKYTE816> create or replace package http pkg 2 as 3 function request(url in varchar2, 4 proxy in varchar2 default NULL) 5 return varchar2; 7 type html pieces is table of varchar2(2000) 8 index by binary integer; 9 10 function request pieces(url in varchar2, 11 max pieces natural default 32767, 12 proxy in varchar2 default NULL) 13 return html pieces; 14 15 init failed exception; 16 request failed exception; Далее следует процедура GET URL, вызывающая стандартную команду GET протокола HTTP на Web-сервере. Она принимает следующие параметры: p url - адрес URL страницы, которую необходимо получить. p proxy - имя:<порт> промежуточного сервера, который следует использовать. Пустое значение показывает, что промежуточный сервер использовать не нужно. Примеры: p proxy => www-proxy или p proxy => www-proxy:80. p status - возвращаемый параметр. Это код статуса HTTP для запроса, возвра- щаемый Web-сервером. 200 означает успешное выполнение, 401 - что не прошла авторизация, и т.д.
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |