Чтение онлайн

на главную

Жанры

Язык программирования Perl
Шрифт:

pod2html --infile=CGI.pm --outfile=CGI.html

будет сгенерирован гипертекстовый документ из 54 страниц, описывающий стандартный модуль для разработчиков CGI-программ на Perl. По солидному объему этого руководства можно судить о том, что многие трудности web-программирования уже решены усилиями Perl-сообщества. Примеры программного формирования документов HTML будут рассмотрены далее в этой лекции при обсуждении средств разработки CGI-программ.

Узлы Всемирной Паутины - это разбросанные по всему миру миллионы web-серверов. Самым популярным и распространенным в сети Интернет остается web-сервер Apache (www.apache.org), распространяемый свободно с открытыми исходными

текстами. Хорошо спроектированная архитектура сервера позволяет подключать к нему модули для расширения функциональности сервера. Одним из популярнейших модулей расширения стал mod_perl, который позволяет интегрировать интерпретатор perl с сервером Apache. Это позволяет не только кардинально увеличить скорость работы CGI-программ, но и разрабатывать на Perl собственные модули, получая полный контроль за выполнением клиентских запросов.

Web-сервер общается с клиентскими программами по протоколу передачи гипертекста HTTP (Hypertext Transfer Protocol). Поскольку весь остальной материал этой лекции связан с передачей данных по указанному протоколу, познакомимся с ним поближе. В соответствии с протоколом HTTP запрос состоит из трех частей, которые приведены в таблице 18.1.

Таблица 18.1. Структура HTTP-запроса

Составные части Описание Примеры
Строка запроса содержит команду, называемую методом, например, GET для запроса ресурса или POST для отправки данных на сервер, и имя ресурса GET /index.html HTTP/1.1
POST /cgi-bin/guestbook.pl HTTP/1.0
Заголовки запроса содержат дополнительную информацию, например, данные о клиенте или указания о языке и кодировке ответа, которые предпочитает клиент User-agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU; rv:1.8.0.1) Gecko/20060130 SeaMonkey/1.0
Accept-Language: "ru-ru,ru; q=0.8,en-us;q=0.5,en;q=0.3"
Тело запроса в нем может содержаться передаваемая на сервер информация (например, данные из полей HTML-формы). nick=Ray&email=ray@conchilomania.ru&comments=Your%20photos%20and%20info%20about%20perl%20are%20fine!

Сервер обрабатывает поступающие от клиентов запросы на расположенные на сервере ресурсы. Если затребован существующий файл, то он отправляется сервером клиенту. Если запрошено обращение к CGI-программе, то сервер запускает ее и отправляет клиенту результат ее выполнения. Ответ HTTP-сервера также состоит из трех частей, которые приведены в таблице 18.2.

Таблица 18.2. Структура HTTP-ответа

Составные части Описание Примеры
Строка ответа содержит цифровой код ответа и текстовое описание состояния запроса HTTP/1.0 200 Document follows
HTTP/1.1 404 Not Found
HTTP/1.0 500 Internal Server Error
Заголовки ответа содержат дополнительную информацию, например, данные о типе и длине посылаемого ресурса Content-type: text/html
Content-length: 1025
Тело ответа содержит передаваемые данные <html>...</html>

Важной особенностью протокола HTTP является то, что он ориентирован на обработку независимых запросов, то есть в

нем не предусмотрено сохранение состояния взаимодействия с клиентом. Поэтому организация сеансовой работы с web-сервером ложится на программиста.

Автоматизировать рутинные действия при обмене данными с помощью HTTP и преодолеть трудности программного взаимодействия с HTTP-серверами помогают многочисленные готовые Perl-модули. Стандартная библиотека LWP (Library for WWW in Perl) содержит разнообразные и мощные средства для работы с ресурсами WWW. С ее помощью можно легко запрограммировать простые и решить весьма нетривиальные задачи. Например, запрос документа с web-сервера записывается всего одной строкой:

use LWP::Simple; # использовать упрощенный интерфейс к LWP

my $page = get 'http://www.perl.com/';

Не сложнее обратиться с запросом к поисковым системам. Для этого нужно в URL указать аргументы поиска. Формат строки запроса к конкретной поисковой машине можно посмотреть в строке браузера. Например, по такому URL можно искать книги по Perl в поисковой системе Google:

$url = 'http://www.google.ru/search?q=Perl+book';

А чтобы найти на сайте CPAN все модули, ориентированные на работу с HTML, нужно отправить такой запрос:

$url= 'http://search.cpan.org/search?query=HTML&mode=module';

Это примеры запросов, отправляемых методом GET, когда аргументы передаются непосредственно в строке, адресующей ресурс. При другом способе запрос отправляется методом POST, а данные запроса отправляются в теле запроса. Если требуется отправить из программы данные HTML-формы на HTTP-сервер методом POST, то это столь же просто делается с помощью LWP:

use LWP::UserAgent; # используем класс 'Клиент' из LWP

use HTTP::Request::Common qw(POST); # и метод POST

my $user_agent = LWP::UserAgent->new; # создаем клиента

# заполняем поля формы для отправки на нужный сайт

my $form = POST 'http://site.ru/cgi-bin/guestbook.pl',

[ nick => 'user', email => 'user@mail.ru',

comments => 'Спасибо за помощь!' ];

# передаем клиенту форму для отправки на сервер

my $response = $user_agent->request($form); # получаем ответ

print $response->as_string; # и выводим его в виде строки

Можно долго говорить о возможностях библиотеки LWP. С ее помощью можно: работать с новостными группами (news), обмениваться файлами по протоколу FTP, отправлять запросы к информационным системам Gopher, читать локальные файлы, отправлять электронную почту и создавать пользовательских агентов для автоматического исследования сайтов (web-роботов или "пауков"). Можно даже быстро набросать простой, но вполне работоспособный web-сервер. Для этого нужно воспользоваться классом HTTP::Daemon:

use HTTP::Daemon; # используем классы HTTP-сервера

my $server_root = '/tmp'; # каталог для файлов сервера

# создаем экземпляр WWW-сервера, слушающего порт 8080

my $httpd = new HTTP::Daemon(LocalPort => 8080); #

while (my $connection = $httpd->accept) { # ждем соединения

# получаем запросы на соединении

while (my $request = $connection->get_request) {

Поделиться:
Популярные книги

Внешняя Зона

Жгулёв Пётр Николаевич
8. Real-Rpg
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Внешняя Зона

Князь

Мазин Александр Владимирович
3. Варяг
Фантастика:
альтернативная история
9.15
рейтинг книги
Князь

Путь Чести

Щукин Иван
3. Жизни Архимага
Фантастика:
фэнтези
боевая фантастика
6.43
рейтинг книги
Путь Чести

Идеальный мир для Лекаря 9

Сапфир Олег
9. Лекарь
Фантастика:
боевая фантастика
юмористическое фэнтези
6.00
рейтинг книги
Идеальный мир для Лекаря 9

Школа. Первый пояс

Игнатов Михаил Павлович
2. Путь
Фантастика:
фэнтези
7.67
рейтинг книги
Школа. Первый пояс

Наследник и новый Новосиб

Тарс Элиан
7. Десять Принцев Российской Империи
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Наследник и новый Новосиб

Бестужев. Служба Государевой Безопасности. Книга третья

Измайлов Сергей
3. Граф Бестужев
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Бестужев. Служба Государевой Безопасности. Книга третья

По дороге пряностей

Распопов Дмитрий Викторович
2. Венецианский купец
Фантастика:
фэнтези
героическая фантастика
альтернативная история
5.50
рейтинг книги
По дороге пряностей

Начальник милиции. Книга 3

Дамиров Рафаэль
3. Начальник милиции
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Начальник милиции. Книга 3

Убивать, чтобы жить

Бор Жорж
1. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Убивать, чтобы жить

Измена. Осколки чувств

Верди Алиса
2. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Осколки чувств

Ведьма

Резник Юлия
Любовные романы:
современные любовные романы
эро литература
8.54
рейтинг книги
Ведьма

Темный Патриарх Светлого Рода 6

Лисицин Евгений
6. Темный Патриарх Светлого Рода
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Темный Патриарх Светлого Рода 6

Светлая ведьма для Темного ректора

Дари Адриана
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Светлая ведьма для Темного ректора