Программирование CGI на Ruby

Ruby — это язык общего назначения, не только язык для WEB-разработки, но Ruby наиболее часто используется при разработке WEB-приложений и WEB-инструментов.

Используя Ruby, можно не только написать собственный SMTP-сервер, FTP-программу или Ruby Web-сервер, но и использовать Ruby для CGI-программирования.

Далее давайте немного времени уделим изучению программирования CGI на Ruby.


Просмотр веб-страниц

Чтобы лучше понять, как работает CGI, мы можем рассмотреть последовательность действий при нажатии ссылки или URL на веб-странице:

  • 1. Используйте браузер, чтобы открыть URL и подключиться к веб-серверу HTTP.
  • 2. После получения запроса веб-сервер анализирует URL и проверяет, существует ли запрашиваемый файл на сервере. Если он существует, он возвращает содержимое файла; в противном случае он возвращает сообщение об ошибке.
  • 3. Браузер получает информацию от сервера и отображает полученный файл или сообщение об ошибке.

CGI-программы могут представлять собой скрипты Ruby, скрипты Python, скрипты PERL, скрипты SHELL, программы на C или C++ и т. д.


Схема архитектуры CGI

cgiarch


Поддержка и настройка веб-сервера

Прежде чем начать программирование CGI, убедитесь, что ваш веб-сервер поддерживает CGI и что обработчик CGI настроен.

Конфигурация CGI в Apache:

Настройте каталог CGI:

ScriptAlias /cgi-bin/ /var/www/cgi-bin/

CGI-программы, выполняемые всеми HTTP-серверами, хранятся в предварительно настроенном каталоге. Этот каталог называется каталогом CGI и по соглашению имеет имя /var/www/cgi-bin.

Расширение файлов CGI — .cgi, и Ruby также может использовать расширение .rb.

По умолчанию на серверах Linux настроенный каталог cgi-bin — /var/www.

Если вы хотите указать другой каталог для запуска CGI-скриптов, вы можете изменить файл конфигурации httpd.conf следующим образом:

<Directory "/var/www/cgi-bin">
   AllowOverride None
   Options +ExecCGI
   Order allow,deny
   Allow from all
</Directory>

Добавьте суффикс .rb в AddHandler, чтобы мы могли получать доступ к файлам сценариев Ruby, заканчивающимся на .rb:

AddHandler cgi-script .cgi .pl .rb

Написание CGI-скриптов

Самый базовый код CGI на Ruby выглядит следующим образом:

#!/usr/bin/ruby

puts "Content-type: text/html\n\n"
puts "<html><body>This is a test</body></html>"

Вы можете сохранить этот код в файл test.cgi, загрузить его на сервер и предоставить достаточные права, после чего он может выполняться как CGI-скрипт.

Если адрес вашего сайта — http://www.example.com/, вы можете обратиться к программе по адресу http://www.example.com/test.cgi, и результат вывода будет: "This is a test."

После того как браузер обратится по URL, веб-сервер найдёт файл test.cgi в каталоге сайта, затем с помощью парсера Ruby разберёт код скрипта и получит доступ к HTML-документу.


Использование cgi.rb

Ruby может подключать библиотеку CGI для написания более сложных CGI-скриптов.

Следующий код подключает библиотеку CGI для создания CGI-скрипта.

#!/usr/bin/ruby

require 'cgi'

cgi = CGI.new
puts cgi.header
puts "<html><body>This is a test</body></html>"

В следующем коде создаётся объект CGI и выводится информация заголовка.


Обработка форм

Используя библиотеку CGI, можно получать данные, отправленные формами (или параметры в URL), двумя способами, например URL: /cgi-bin/test.cgi?FirstName=Zara&LastName=Ali.

Вы можете использовать CGI#[] для непосредственного получения параметров FirstName и LastName:

#!/usr/bin/ruby

require 'cgi'
cgi = CGI.new
cgi['FirstName'] # =>  ["Zara"]
cgi['LastName']  # =>  ["Ali"]

Другой способ получения данных формы:

#!/usr/bin/ruby

require 'cgi'
cgi = CGI.new
h = cgi.params  # =>  {"FirstName"=>["Zara"],"LastName"=>["Ali"]}
h['FirstName']  # =>  ["Zara"]
h['LastName']   # =>  ["Ali"]

Следующий код используется для получения всех пар ключ-значение:

#!/usr/bin/ruby

require 'cgi'
cgi = CGI.new
cgi.keys         # =>  ["FirstName", "LastName"]

Если форма содержит несколько полей с одинаковым именем, значения одного и того же поля будут сохранены в массиве.

В следующем примере в форме указаны три одинаковых поля "name" со значениями "Zara", "Huma" и "Nuha":

#!/usr/bin/ruby

require 'cgi'
cgi = CGI.new
cgi['name']        # => "Zara"
cgi.params['name'] # => ["Zara", "Huma", "Nuha"]
cgi.keys           # => ["name"]
cgi.params         # => {"name"=>["Zara", "Huma", "Nuha"]}

Примечание:Ruby автоматически определяет методы GET и POST, поэтому нет необходимости по-разному обрабатывать эти два метода.

Ниже приведён соответствующий HTML-код:

<html>
<body>
<form method="POST" action="http://www.example.com/test.cgi">
First Name :<input type="text" name="FirstName" value="" />
<br />
Last Name :<input type="text" name="LastName" value="" /> 

<input type="submit" value="Submit Data" />
</form>
</body>
</html>

Создание формы и HTML

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

Чтобы упростить вложение тегов, эти методы принимают содержимое в виде блока кода, а блок кода возвращает строку как содержимое тега. Как показано ниже:

#!/usr/bin/ruby

require "cgi"
cgi = CGI.new("html4")
cgi.out{
   cgi.html{
      cgi.head{ "\n"+cgi.title{"This Is a Test"} } +
      cgi.body{ "\n"+
         cgi.form{"\n"+
            cgi.hr +
            cgi.h1 { "A Form: " } + "\n"+
            cgi.textarea("get_text") +"\n"+
            cgi.br +
            cgi.submit
         }
      }
   }
}

Экранирование строк

Когда вы работаете с параметрами в URL-адресах или данными HTML-форм, вам нужно экранировать некоторые специальные символы, такие как кавычки (") и обратная косая черта (/).

Объект Ruby CGI предоставляет методы CGI.escape и CGI.unescape для обработки экранирования этих специальных символов:

#!/usr/bin/ruby

require 'cgi'
puts CGI.escape(Zara Ali/A Sweet & Sour Girl")

Результат выполнения приведённого выше кода следующий:

#!/usr/bin/ruby

require 'cgi'
puts CGI.escape(Zara Ali/A Sweet & Sour Girl")

Ещё один набор примеров:

#!/usr/bin/ruby

require 'cgi'
puts CGI.escapeHTML('<h1>Zara Ali/A Sweet & Sour Girl</h1>')

Результат выполнения приведённого выше кода следующий:

&lt;h1&gt;Zara Ali/A Sweet & Sour Girl&lt;/h1&gt;'

Часто используемые методы в классе CGI

Ниже приведены соответствующие методы полного класса CGI в Ruby

  • Ruby CGI- Стандартные методы библиотеки CGI

Куки и сессии

Другие расширения