Perl - Программирование CGI
Что такое CGI?
Общий интерфейс шлюза или CGI - это набор стандартов, которые определяют, как происходит обмен информацией между веб-сервером и настраиваемым сценарием.
Спецификации CGI в настоящее время поддерживаются NCSA, и NCSA определяет CGI следующим образом:
Общий интерфейс шлюза, или CGI, является стандартом для программ внешнего шлюза для взаимодействия с информационными серверами, такими как серверы HTTP.
Текущая версия - CGI / 1.1, а CGI / 1.2 находится в стадии разработки.
Просмотр веб-страниц
Чтобы понять концепцию CGI, давайте посмотрим, что происходит, когда мы щелкаем гиперссылку, доступную на веб-странице, для просмотра определенной веб-страницы или URL-адреса.
Ваш браузер связывается с веб-сервером, используя протокол HTTP, и запрашивает URL-адрес, то есть имя файла веб-страницы.
Веб-сервер проверит URL-адрес и будет искать запрошенное имя файла. Если веб-сервер находит этот файл, он отправляет файл обратно в браузер без дальнейшего выполнения, в противном случае отправляет сообщение об ошибке, указывающее, что вы запросили неправильный файл.
Веб-браузер принимает ответ от веб-сервера и отображает либо полученное содержимое файла, либо сообщение об ошибке, если файл не найден.
Однако можно настроить HTTP-сервер таким образом, чтобы при каждом запросе файла в определенном каталоге этот файл не отправлялся обратно; вместо этого он выполняется как программа, и все, что эта программа выводит в результате, отправляется обратно в ваш браузер для отображения. Это можно сделать с помощью специальной функции, доступной на веб-сервере, которая называетсяCommon Gateway Interfaceили CGI и такие программы, которые выполняются сервером для получения конечного результата, называются сценариями CGI. Эти программы CGI могут быть сценариями PERL, сценариями оболочки, программами C или C ++ и т. Д.
Схема архитектуры CGI
Поддержка и настройка веб-сервера
Прежде чем приступить к программированию CGI, убедитесь, что ваш веб-сервер поддерживает функциональность CGI и настроен для обработки программ CGI. Все программы CGI, выполняемые веб-сервером, хранятся в предварительно настроенном каталоге. Этот каталог называется каталогом CGI и по соглашению называется / cgi-bin. По соглашению файлы Perl CGI будут иметь расширение как.cgi.
Первая программа CGI
Вот простая ссылка, которая связана со сценарием CGI под названием hello.cgi . Этот файл хранился в/cgi-bin/каталог и имеет следующее содержимое. Перед запуском вашей программы CGI убедитесь, что у вас есть режим изменения файла, используяchmod 755 hello.cgi Команда UNIX.
#!/usr/bin/perl
print "Content-type:text/html\r\n\r\n";
print '<html>';
print '<head>';
print '<title>Hello Word - First CGI Program</title>';
print '</head>';
print '<body>';
print '<h2>Hello Word! This is my first CGI program</h2>';
print '</body>';
print '</html>';
1;
Теперь, если вы нажмете hello.cgi ссылка, затем запрос отправляется на веб-сервер, который ищет hello.cgi в каталоге / cgi-bin, выполняет его, и независимо от полученного результата веб-сервер отправляет этот результат обратно в веб-браузер, что выглядит следующим образом:
Hello Word! This is my first CGI program
Этот сценарий hello.cgi представляет собой простой сценарий Perl, который записывает свой вывод в файл STDOUT, то есть на экран. Доступна одна важная и дополнительная функция - первая строка для печати.Content-type:text/html\r\n\r\n. Эта строка отправляется обратно в браузер и указывает тип контента, который будет отображаться на экране браузера. Теперь у вас должна быть базовая концепция CGI, и вы можете писать множество сложных CGI-программ, используя Perl. Этот сценарий может взаимодействовать с любой другой внешней системой, а также для обмена информацией, такой как база данных, веб-службы или любые другие сложные интерфейсы.
Понимание HTTP-заголовка
Самая первая строка Content-type:text/html\r\n\r\nявляется частью HTTP-заголовка, который отправляется браузеру, чтобы браузер мог понимать входящий контент со стороны сервера. Весь HTTP-заголовок будет в следующей форме -
HTTP Field Name: Field Content
Например -
Content-type:text/html\r\n\r\n
Есть несколько других важных заголовков HTTP, которые вы часто будете использовать в программировании CGI.
Sr.No. | Заголовок и описание |
---|---|
1 | Content-type: String Строка MIME, определяющая формат возвращаемого содержимого. Пример: Content-type: text / html |
2 | Expires: Date String Дата, когда информация становится недействительной. Это должно использоваться браузером, чтобы решить, когда страницу нужно обновить. Допустимая строка даты должна быть в формате 01 января 1998 12:00:00 GMT. |
3 | Location: URL String URL-адрес, который должен быть возвращен вместо запрашиваемого URL-адреса. Вы можете использовать это поле для перенаправления запроса в любое другое место. |
4 | Last-modified: String Дата последней модификации файла. |
5 | Content-length: String Длина возвращаемых данных в байтах. Браузер использует это значение, чтобы сообщить приблизительное время загрузки файла. |
6 | Set-Cookie: String Установите cookie, передаваемый через строку |
Переменные среды CGI
Вся программа CGI будет иметь доступ к следующим переменным среды. Эти переменные играют важную роль при написании любой программы CGI.
Sr.No. | Имена и описание переменных |
---|---|
1 | CONTENT_TYPE Тип данных содержимого. Используется, когда клиент отправляет прикрепленный контент на сервер. Например, загрузка файлов и т. Д. |
2 | CONTENT_LENGTH Длина информации запроса. Доступно только для запросов POST |
3 | HTTP_COOKIE Возвращает установленные файлы cookie в виде пары ключ и значение. |
4 | HTTP_USER_AGENT Поле заголовка запроса User-Agent содержит информацию о пользовательском агенте, создавшем запрос. Название веб-браузера. |
5 | PATH_INFO Путь к сценарию CGI. |
6 | QUERY_STRING Информация в кодировке URL, отправляемая с запросом метода GET. |
7 | REMOTE_ADDR IP-адрес удаленного хоста, отправляющего запрос. Это может быть полезно для ведения журнала или для аутентификации. |
8 | REMOTE_HOST Полное имя хоста, выполняющего запрос. Если эта информация недоступна, то REMOTE_ADDR можно использовать для получения IR-адреса. |
9 | REQUEST_METHOD Метод, использованный для отправки запроса. Наиболее распространены методы GET и POST. |
10 | SCRIPT_FILENAME Полный путь к сценарию CGI. |
11 | SCRIPT_NAME Имя сценария CGI. |
12 | SERVER_NAME Имя хоста или IP-адрес сервера. |
13 | SERVER_SOFTWARE Название и версия программного обеспечения, на котором работает сервер. |
Вот небольшая программа CGI, в которой перечислены все переменные CGI, поддерживаемые вашим веб-сервером. Щелкните эту ссылку, чтобы увидеть результат Получить среду
#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "<font size=+1>Environment</font>\n";
foreach (sort keys %ENV) {
print "<b>$_</b>: $ENV{$_}<br>\n";
}
1;
Поднять диалоговое окно «Загрузка файла»?
Иногда желательно, чтобы вы хотели предоставить вариант, при котором пользователь щелкнет ссылку, и появится всплывающее диалоговое окно «Загрузка файла» для пользователя вместо отображения фактического содержимого. Это очень просто и будет достигнуто через HTTP-заголовок.
Этот заголовок HTTP будет отличаться от заголовка, упомянутого в предыдущем разделе. Например, если вы хотите сделатьFileName файл, загружаемый по заданной ссылке, его синтаксис будет следующим:
#!/usr/bin/perl
# HTTP Header
print "Content-Type:application/octet-stream; name = \"FileName\"\r\n";
print "Content-Disposition: attachment; filename = \"FileName\"\r\n\n";
# Actual File Content will go hear.
open( FILE, "<FileName" );
while(read(FILE, $buffer, 100) ) {
print("$buffer");
}
Методы GET и POST
Вы, должно быть, сталкивались со многими ситуациями, когда вам нужно передать некоторую информацию из вашего браузера на веб-сервер и, в конечном итоге, в вашу программу CGI, обрабатывающую ваши запросы. Чаще всего браузер использует два метода для передачи этой информации на веб-сервер. Эти методыGET Метод и POSTМетод. Давайте проверим их по очереди.
Передача информации с использованием метода GET
Метод GET отправляет закодированную информацию о пользователе, добавленную к самому URL-адресу страницы. Страница и закодированная информация разделяются знаком? характер следующим образом -
http://www.test.com/cgi-bin/hello.cgi?key1=value1&key2=value2
Метод GET - это метод по умолчанию для передачи информации из браузера на веб-сервер, и он создает длинную строку, которая появляется в поле Location: вашего браузера. Вы никогда не должны использовать метод GET, если у вас есть пароль или другая конфиденциальная информация для передачи на сервер. Метод GET имеет ограничение по размеру: в строке запроса можно передать только 1024 символа.
Эта информация передается с использованием QUERY_STRING заголовок и будет доступен в вашей программе CGI через переменную среды QUERY_STRING, которую вы можете проанализировать и использовать в своей программе CGI.
Вы можете передавать информацию, просто объединяя пары ключ и значение вместе с любым URL-адресом, или вы можете использовать теги HTML <FORM> для передачи информации с помощью метода GET.
Пример простого URL: метод получения
Вот простой URL-адрес, который передаст два значения программе hello_get.cgi с помощью метода GET.
http://www.tutorialspoint.com/cgi-bin/hello_get.cgi?first_name=ZARA&last_name=ALIНиже hello_get.cgi сценарий для обработки ввода данных веб-браузером.
#!/usr/bin/perl
local ($buffer, @pairs, $pair, $name, $value, %FORM);
# Read in text
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "GET") {
$buffer = $ENV{'QUERY_STRING'};
}
# Split information into name/value pairs
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%(..)/pack("C", hex($1))/eg;
$FORM{$name} = $value;
}
$first_name = $FORM{first_name};
$last_name = $FORM{last_name};
print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print "<title>Hello - Second CGI Program</title>";
print "</head>";
print "<body>";
print "<h2>Hello $first_name $last_name - Second CGI Program</h2>";
print "</body>";
print "</html>";
1;
Простой пример FORM: метод GET
Вот простой пример, который передает два значения с помощью HTML FORM и кнопки отправки. Мы собираемся использовать тот же сценарий CGI hello_get.cgi для обработки этого ввода.
<FORM action = "/cgi-bin/hello_get.cgi" method = "GET">
First Name: <input type = "text" name = "first_name"> <br>
Last Name: <input type = "text" name = "last_name">
<input type = "submit" value = "Submit">
</FORM>
Вот фактический результат кодирования формы выше. Теперь вы можете ввести имя и фамилию, а затем нажать кнопку отправки, чтобы увидеть результат.
Передача информации с использованием метода POST
Более надежный метод передачи информации программе CGI - это POSTметод. Это упаковывает информацию точно так же, как методы GET, но вместо того, чтобы отправлять ее в виде текстовой строки после?в URL-адресе он отправляет его как отдельное сообщение как часть HTTP-заголовка. Веб-сервер передает это сообщение сценарию CGI в форме стандартного ввода.
Ниже приведен измененный hello_post.cgiсценарий для обработки ввода данных веб-браузера. Этот сценарий будет обрабатывать GET, а также метод POST.
#!/usr/bin/perl
local ($buffer, @pairs, $pair, $name, $value, %FORM);
# Read in text
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
} else {
$buffer = $ENV{'QUERY_STRING'};
}
# Split information into name/value pairs
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%(..)/pack("C", hex($1))/eg;
$FORM{$name} = $value;
}
$first_name = $FORM{first_name};
$last_name = $FORM{last_name};
print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print "<title>Hello - Second CGI Program</title>";
print "</head>";
print "<body>";
print "<h2>Hello $first_name $last_name - Second CGI Program</h2>";
print "</body>";
print "</html>";
1;
Давайте снова возьмем тот же пример, что и выше, который передает два значения с помощью HTML FORM и кнопки отправки. Мы собираемся использовать CGI-скрипт hello_post.cgi для обработки этого ввода.
<FORM action = "/cgi-bin/hello_post.cgi" method = "POST">
First Name: <input type = "text" name = "first_name"> <br>
Last Name: <input type = "text" name = "last_name">
<input type = "submit" value = "Submit">
</FORM>
Вот фактический результат приведенного выше кодирования формы. Вы вводите имя и фамилию, а затем нажимаете кнопку отправки, чтобы увидеть результат.
Передача данных флажка в программу CGI
Флажки используются, когда требуется выбрать более одного параметра. Вот пример HTML-кода для формы с двумя флажками.
<form action = "/cgi-bin/checkbox.cgi" method = "POST" target = "_blank">
<input type = "checkbox" name = "maths" value = "on"> Maths
<input type = "checkbox" name = "physics" value = "on"> Physics
<input type = "submit" value = "Select Subject">
</form>
Результатом этого кода является следующая форма -
Ниже checkbox.cgi скрипт для обработки ввода, предоставленного веб-браузером для переключателя.
#!/usr/bin/perl
local ($buffer, @pairs, $pair, $name, $value, %FORM);
# Read in text
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
} else {
$buffer = $ENV{'QUERY_STRING'};
}
# Split information into name/value pairs
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%(..)/pack("C", hex($1))/eg;
$FORM{$name} = $value;
}
if( $FORM{maths} ) {
$maths_flag ="ON";
} else {
$maths_flag ="OFF";
}
if( $FORM{physics} ) {
$physics_flag ="ON";
} else {
$physics_flag ="OFF";
}
print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print "<title>Checkbox - Third CGI Program</title>";
print "</head>";
print "<body>";
print "<h2> CheckBox Maths is : $maths_flag</h2>";
print "<h2> CheckBox Physics is : $physics_flag</h2>";
print "</body>";
print "</html>";
1;
Передача данных радиокнопки в программу CGI
Радиокнопки используются, когда требуется выбрать только один вариант. Вот пример HTML-кода для формы с двумя переключателями -
<form action = "/cgi-bin/radiobutton.cgi" method = "POST" target = "_blank">
<input type = "radio" name = "subject" value = "maths"> Maths
<input type = "radio" name = "subject" value = "physics"> Physics
<input type = "submit" value = "Select Subject">
</form>
Результатом этого кода является следующая форма -
Ниже radiobutton.cgi скрипт для обработки ввода, предоставленного веб-браузером для переключателя.
#!/usr/bin/perl
local ($buffer, @pairs, $pair, $name, $value, %FORM);
# Read in text
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
} else {
$buffer = $ENV{'QUERY_STRING'};
}
# Split information into name/value pairs
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%(..)/pack("C", hex($1))/eg;
$FORM{$name} = $value;
}
$subject = $FORM{subject};
print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print "<title>Radio - Fourth CGI Program</title>";
print "</head>";
print "<body>";
print "<h2> Selected Subject is $subject</h2>";
print "</body>";
print "</html>";
1;
Передача данных текстовой области в программу CGI
Элемент textarea используется, когда многострочный текст должен быть передан программе CGI. Вот пример HTML-кода для формы с полем ТЕКСТАРА -
<form action = "/cgi-bin/textarea.cgi" method = "POST" target = "_blank">
<textarea name = "textcontent" cols = 40 rows = 4>
Type your text here...
</textarea>
<input type = "submit" value = "Submit">
</form>
Результатом этого кода является следующая форма -
Ниже textarea.cgi сценарий для обработки ввода данных веб-браузером.
#!/usr/bin/perl
local ($buffer, @pairs, $pair, $name, $value, %FORM);
# Read in text
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
} else {
$buffer = $ENV{'QUERY_STRING'};
}
# Split information into name/value pairs
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%(..)/pack("C", hex($1))/eg;
$FORM{$name} = $value;
}
$text_content = $FORM{textcontent};
print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print "<title>Text Area - Fifth CGI Program</title>";
print "</head>";
print "<body>";
print "<h2> Entered Text Content is $text_content</h2>";
print "</body>";
print "</html>";
1;
Передача данных раскрывающегося списка в программу CGI
Выпадающий список используется, когда у нас много доступных опций, но будут выбраны только один или два. Вот пример HTML-кода для формы с одним раскрывающимся списком
<form action = "/cgi-bin/dropdown.cgi" method = "POST" target = "_blank">
<select name = "dropdown">
<option value = "Maths" selected>Maths</option>
<option value = "Physics">Physics</option>
</select>
<input type = "submit" value = "Submit">
</form>
Результатом этого кода является следующая форма -
Ниже dropdown.cgi сценарий для обработки ввода данных веб-браузером.
#!/usr/bin/perl
local ($buffer, @pairs, $pair, $name, $value, %FORM);
# Read in text
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
} else {
$buffer = $ENV{'QUERY_STRING'};
}
# Split information into name/value pairs
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%(..)/pack("C", hex($1))/eg;
$FORM{$name} = $value;
}
$subject = $FORM{dropdown};
print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print "<title>Dropdown Box - Sixth CGI Program</title>";
print "</head>";
print "<body>";
print "<h2> Selected Subject is $subject</h2>";
print "</body>";
print "</html>";
1;
Использование файлов cookie в CGI
Протокол HTTP - это протокол без сохранения состояния. Но для коммерческого веб-сайта требуется поддерживать информацию о сеансе между разными страницами. Например, регистрация одного пользователя заканчивается после транзакции, охватывающей множество страниц. Но как сохранить информацию о сеансе пользователя на всех веб-страницах?
Во многих ситуациях использование файлов cookie является наиболее эффективным методом запоминания и отслеживания предпочтений, покупок, комиссионных и другой информации, необходимой для лучшего взаимодействия с посетителями или статистики сайта.
Как это устроено
Ваш сервер отправляет некоторые данные в браузер посетителя в виде файла cookie. Браузер может принять файл cookie. Если это так, он сохраняется в виде простой текстовой записи на жестком диске посетителя. Теперь, когда посетитель переходит на другую страницу вашего сайта, cookie доступен для поиска. После получения ваш сервер знает / запоминает, что было сохранено.
Файлы cookie представляют собой запись данных в виде простого текста из 5 полей переменной длины:
Expires- Дата истечения срока действия cookie. Если это поле пусто, срок действия cookie истечет, когда посетитель закроет браузер.
Domain - Доменное имя вашего сайта.
Path- Путь к каталогу или веб-странице, в которой установлен файл cookie. Это может быть пустое поле, если вы хотите получить cookie из любого каталога или страницы.
Secure- Если это поле содержит слово «безопасный», то файл cookie может быть получен только с помощью безопасного сервера. Если это поле пустое, такое ограничение отсутствует.
Name = Value - Файлы cookie устанавливаются и повторно просматриваются в виде пар ключ-значение.
Настройка файлов cookie
Отправить файлы cookie в браузер очень просто. Эти файлы cookie будут отправлены вместе с заголовком HTTP. Предполагая, что вы хотите установить UserID и Password как файлы cookie. Итак, это будет сделано следующим образом -
#!/usr/bin/perl
print "Set-Cookie:UserID = XYZ;\n";
print "Set-Cookie:Password = XYZ123;\n";
print "Set-Cookie:Expires = Tuesday, 31-Dec-2007 23:12:40 GMT";\n";
print "Set-Cookie:Domain = www.tutorialspoint.com;\n";
print "Set-Cookie:Path = /perl;\n";
print "Content-type:text/html\r\n\r\n";
...........Rest of the HTML Content goes here....
Здесь мы использовали Set-CookieЗаголовок HTTP для установки файлов cookie. Необязательно устанавливать такие атрибуты файлов cookie, как Expires, Domain и Path. Важно отметить, что файлы cookie устанавливаются перед отправкой magic line."Content-type:text/html\r\n\r\n.
Получение файлов cookie
Получить все установленные файлы cookie очень просто. Файлы cookie хранятся в переменной среды CGI HTTP_COOKIE и будут иметь следующую форму.
key1 = value1;key2 = value2;key3 = value3....
Вот пример того, как получить файлы cookie.
#!/usr/bin/perl
$rcvd_cookies = $ENV{'HTTP_COOKIE'};
@cookies = split /;/, $rcvd_cookies;
foreach $cookie ( @cookies ) {
($key, $val) = split(/=/, $cookie); # splits on the first =.
$key =~ s/^\s+//;
$val =~ s/^\s+//;
$key =~ s/\s+$//;
$val =~ s/\s+$//;
if( $key eq "UserID" ) {
$user_id = $val;
} elsif($key eq "Password") {
$password = $val;
}
}
print "User ID = $user_id\n";
print "Password = $password\n";
Это приведет к следующему результату, если вышеупомянутые файлы cookie были установлены до вызова сценария извлечения файлов cookie.
User ID = XYZ
Password = XYZ123
Модули и библиотеки CGI
В Интернете вы найдете множество встроенных модулей, которые предоставляют вам прямые функции для использования в вашей программе CGI. Ниже приведены важные моменты.
Модуль CGI
Беркли cgi-lib.pl